Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 835

/ вопрос решён /

Здравствуйте! Уважаемые эксперты! это опять я.

в StringGrid нужно проверить содержимое ячейки и выполнить действие(изменение шрифта и цвета ячейки).
выполняю проверку (код описан).

собственно вопрос, можно ли заменить это огромное перечисление
каким-нибудь набором? пробовал Set of компилятор выдаёт ошибку про несовместимость данных.

Приложение:
  1.  


Ham_ele_on Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Ham_ele_on (статус: Посетитель)
Вопрос отправлен: 18 декабря 2010, 19:51
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Ham_ele_on!
Да, можно! И что интересно, оно будет даже несколько быстрее вашего кода, заметно легче модифицироваться, иметь пару плюшек и выглядеть красивее.
Для начала объявим себе где то глобально или как свойство формы TStringList, который будет хранить слова, которые нужно будет сравнивать.

private
  sl:TStringList;
В конструкторе формы (FormCreate) создадим и заполним его
sl := TStringList.create;
sl.add('Привет');
sl.add('пока');
sl.add('Да');
sl.add('нет');
sl.add('возможно');
// отсортируем его.
sl.sorted := true;
// это очень хорошо, так как теперь поиск будет не ленейный, а логарифмический.
// к примеру, на 1024 элемента, при линейном поиске нужно сделать в среднем 512 шагов, а в линейном - 10
теперь при удалении формы (FormDestroy)добавим освобождение ресурсов
sl.free;

А теперь самое интересное. Условие для сравнения.
if (sl.find(SG.Cells[ACol,ARow]) <> -1) then begin
// строка найдена.
end;

Преимущества - теперь массив строк можно менять на лету - все будет работать.
Преимущество второе, скрытое. у TStringList есть свойство object, куда можно добавлять свой объект. Можно создать свои объекты, которые хранят параметры ячейки для данного слова и получать все что угодно:) Но это уже для домашнего задания.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 18 декабря 2010, 21:25
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 58; последнее сообщение — 24 февраля 2011, 11:23; участников в обсуждении: 3.

Страницы: [« Предыдущая] [1] [2] [3]

min@y™

min@y™ (статус: Доктор наук), 18 февраля 2011, 11:31 [#41]:

Вот, написал консольный пример. В нём формируется рандомный список из 10 элементов типа (X:Y), выводится на консоль, сортируется и опять выводится. Вот вывод консоли:
  Unsorted list:
   131   139
    68   176
    15   105
     5    17
   212   115
   199   102
    68    57
    45   130
   192   172
   142     2
 
  List after sorting:
     5    17
    15   105
    45   130
    68    57
    68   176
   131   139
   142     2
   192   172
   199   102
   212   115
Такая сортировка тебе подходит?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ham_ele_on

Ham_ele_on (статус: Посетитель), 18 февраля 2011, 13:11 [#42]:

да , так и должно быть.
только я сначала сам попробую :-)
min@y™

min@y™ (статус: Доктор наук), 18 февраля 2011, 13:24 [#43]:

Цитата (Ham_ele_on):

да , так и должно быть. только я сначала сам попробую :-)

Вот тебе исходник, упражняйся.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ham_ele_on

Ham_ele_on (статус: Посетитель), 19 февраля 2011, 08:27 [#44]:

>Вот тебе исходник,
разбирая исходник начал понимать суть, но возник другой вопрос
как сохранить и прочитать из файла(предполагая, что через поток), при условии, что материалов будет несколько
[Mat]=123/234,345/567;
[Mat2]=987/876,654/543;
[Mat3]=.../...,.../... и т.д.
если нужно создавать свой класс, то пожалуйста поподробнее, а то у меня с созданием классов туго очень.
min@y™

min@y™ (статус: Доктор наук), 19 февраля 2011, 11:28 [#45]:

А что хранится в этом файле?
Где описание формата?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ham_ele_on

Ham_ele_on (статус: Посетитель), 19 февраля 2011, 13:03 [#46]:

может быть бинарный или текстовый, это большого значения не имеет
min@y™

min@y™ (статус: Доктор наук), 19 февраля 2011, 13:50 [#47]:

Тогда сохраняй, как тебе нравится.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ham_ele_on

Ham_ele_on (статус: Посетитель), 21 февраля 2011, 15:15 [#48]:

А TList можно сохранять(то есть, он в принципе сохраняется в файл??)? или надо как то по другому?
min@y™

min@y™ (статус: Доктор наук), 21 февраля 2011, 15:30 [#49]:

Цитата (Ham_ele_on):

А TList можно сохранять(то есть, он в принципе сохраняется в файл??)? или надо как то по другому?

Нет, по-другому надо. Содержимое TList перегонять в TFileStream и всего делов!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ham_ele_on

Ham_ele_on (статус: Посетитель), 21 февраля 2011, 17:34 [#50]:

я так сделал, сохранил...а вот прочитать не получается, ошибка вылетает
procedure TForm1.Button1Click(Sender: TObject);
var Ftl: TFileStream; L:TList; i,k:integer; V:Integer;
begin
try
 Ftl:=TFileStream.Create('C:\FTL.txt',fmOpenRead);
 L:=TList.Create;
 Ftl.Read(L,SizeOf(L));
  L.Assign(L);
 for i := 0 to L.Count - 1 do
 begin
 V:=Integer(L.Items[i]);
  ListBox1.Items.Add(inttostr(V));
 end;
finally
  L.Free;
  Ftl.Free;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var Ftl: TFileStream; L:TList; i,k:integer; Value:integer;
begin
try
  L:=TList.Create;
  for i := 0 to 10 do
  L.Add(Pointer(i));
  Ftl:=TFileStream.Create('C:\FTL.txt',fmOpenWrite);
  Ftl.Write(L,SizeOf(L)) ;
finally
  Ftl.Free;
  L.Free;
end;  
end;
end.
min@y™

min@y™ (статус: Доктор наук), 21 февраля 2011, 19:52 [#51]:

Жуть какая! Я теперь всю ночь спать не буду.Зачем я это прочитал?!!..
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ham_ele_on

Ham_ele_on (статус: Посетитель), 21 февраля 2011, 23:06 [#52]:

скажи где прочитать про "не жуть". а то я ищу то не знаю что.
min@y™

min@y™ (статус: Доктор наук), 22 февраля 2011, 08:16 [#53]:

Вот, написал я тебе функцию сохранения. Найди, как говорится, 10 отличий. Функцию загрузки сам напишешь, или опять это делать мне?
function SaveListToFile(AList: TList; const AFileName: string): Boolean;
var
  Index: Integer;
  Stream: TFileStream;
begin
  try
    Stream:= TFileStream.Create(FileName, fmCreate or fmShareExclusive);
    try
      for Index:= 0 to AList.Count - 1 do
        Stream.Write(Cardinal(AList[Index]), SizeOf(Cardinal));
    finally
      Stream.Free();
    end;
 
    Result:= True;
  except
    Result:= False;
    Application.MessageBox(PChar('Ошибка при работе с файлом ' + AFileName + '.'),
                           PChar('Ошибка'),
                           MB_OK + MB_ICONERROR);
  end;
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 22 февраля 2011, 11:41 [#54]:

Цитата (Ham_ele_on):


отсюда просьба, посоветуй какой нибудь мануал по изучению делфи.
P\S. куда пиво прислать?

Мануал ищи в разделе "Библиотека". Рекомендую книжку "Delphi 5. Руководство разработчика". Очень хорошая вещь. Ну и, конечно, практики побольше. Пиши программы по любому поводу.

З.Ы. Пиво присылай на номер 8 920 991 12 99. Звонить туда бесполезно, это 3Ж-модем, но смски он принимает. :)
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ham_ele_on

Ham_ele_on (статус: Посетитель), 23 февраля 2011, 21:54 [#55]:

этот код не проходит
Stream.Write(Cardinal(AList[Index]), SizeOf(Cardinal));
в этом месте выдаёт ошибку.
я немного переделал.(правда тут ещё заполнение листа)
procedure TForm1.Button1Click(Sender: TObject);
var List:TList; i,k,x:Integer; Stream:TFileStream; Value:Cardinal;
begin
x:=0;
try
List:=TList.Create;
 
for i:= 0 to 9 do
begin
 x:=5+x;
 List.Add(pointer(x));
end;
 
 Stream:=TFileStream.Create('c:\List.txt',fmCreate);
 for k := 0 to List.Count - 1 do
   begin
   Value:=Cardinal(List.Items[k]);
 Stream.Write(Value,SizeOf(Value));
   end;
finally
  stream.Free;
  List.Free;
end;
 
end;
и вроде как нормально стало(в смысле сохраняется)

а вот при открытии....
procedure TForm1.Button2Click(Sender: TObject);
var List:TList; i,k:Integer; Stream:TFileStream; Value:Cardinal;
begin
try
Stream:=TFileStream.Create('c:\List.txt',fmOpenRead);
List:=TList.Create;
for i := Stream.Seek(0,soFromBeginning) to (Stream.Size div SizeOf(i))-1 do
   begin
     Stream.Read(i,SizeOf(i));
     List.Add(Pointer(i));
   end;
 for k := 0 to List.Count - 1 do
  begin
    Value:=Cardinal(List.Items[k]);
    ListBox1.Items.Add(inttostr(Value));
  end;
 
finally
  stream.Free;
  List.Free;
end;
 
end;

вопрос такой, а если я захочу несколько TList в один файл сохранить???
я так понимаю, тут построчная запись в файл идёт, а как "границы" расставить???

P/S. всех с прошедшим праздником
min@y™

min@y™ (статус: Доктор наук), 24 февраля 2011, 10:13 [#56]:

Цитата (Ham_ele_on):

в этом месте выдаёт ошибку.

Ошибку исправил, а также сделал загрузку.
Вот работающий исходник.

Цитата (Ham_ele_on):

вопрос такой, а если я захочу несколько TList в один файл сохранить??? я так понимаю, тут построчная запись в файл идёт, а как "границы" расставить???

Здесь немножко сложнее, но сделать можно. Сначала определись, как у тебя данные храниться будут, потом я скажу структуру файла.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ham_ele_on

Ham_ele_on (статус: Посетитель), 24 февраля 2011, 10:29 [#57]:

>Здесь немножко сложнее, но сделать можно
понятно, потом видимо возникнет сложность при проверке данных.
оставлю как было, TList для сортировки, а данные в массив сохраняю.
спасибо за помощь, ещё один "инструмент" для себя открыл.
щас попробую разобраться как в TList и TStringList объекты сохранять.

ещё такой вопрос
X1:= Value1 and $FFFF;
Y1:= Value1 shr 16;
почему тут в Hex значения?
в таком варианте больше 5 знаков в числе не получается.
min@y™

min@y™ (статус: Доктор наук), 24 февраля 2011, 11:23 [#58]:

Цитата (Ham_ele_on):

ещё такой вопрос X1:= Value1 and $FFFF; Y1:= Value1 shr 16; почему тут в Hex значения? в таком варианте больше 5 знаков в числе не получается.

Всё там получается. $FFFF - это и есть 65535. А Y - в старшее слово загоняется с помощью сдвига. Например, пусть X = 12345 = $3039, Y = 54321 = $D431. Тогда Value = $D4313039 = 3559993401.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Страницы: [« Предыдущая] [1] [2] [3]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 25 апреля 2026, 22:05
Выполнено за 0.05 сек.