|
Вопрос # 4 835/ вопрос решён / |
|
Здравствуйте! Уважаемые эксперты! это опять я.
в StringGrid нужно проверить содержимое ячейки и выполнить действие(изменение шрифта и цвета ячейки).
выполняю проверку (код описан).
собственно вопрос, можно ли заменить это огромное перечисление
каким-нибудь набором? пробовал Set of компилятор выдаёт ошибку про несовместимость данных.
 |
Вопрос задал: 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™ (статус: Доктор наук), 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 (статус: Посетитель), 18 февраля 2011, 13:11 [#42]:
да , так и должно быть.
только я сначала сам попробую
|
|
min@y™ (статус: Доктор наук), 18 февраля 2011, 13:24 [#43]:
Цитата (Ham_ele_on):
да , так и должно быть. только я сначала сам попробую
Вот тебе исходник, упражняйся.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ham_ele_on (статус: Посетитель), 19 февраля 2011, 08:27 [#44]:
>Вот тебе исходник,
разбирая исходник начал понимать суть, но возник другой вопрос
как сохранить и прочитать из файла(предполагая, что через поток), при условии, что материалов будет несколько
[Mat]=123/234,345/567;
[Mat2]=987/876,654/543;
[Mat3]=.../...,.../... и т.д.
если нужно создавать свой класс, то пожалуйста поподробнее, а то у меня с созданием классов туго очень.
|
|
min@y™ (статус: Доктор наук), 19 февраля 2011, 11:28 [#45]:
А что хранится в этом файле?
Где описание формата?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ham_ele_on (статус: Посетитель), 19 февраля 2011, 13:03 [#46]:
может быть бинарный или текстовый, это большого значения не имеет
|
|
min@y™ (статус: Доктор наук), 19 февраля 2011, 13:50 [#47]:
Тогда сохраняй, как тебе нравится.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ham_ele_on (статус: Посетитель), 21 февраля 2011, 15:15 [#48]:
А TList можно сохранять(то есть, он в принципе сохраняется в файл??)? или надо как то по другому?
|
|
min@y™ (статус: Доктор наук), 21 февраля 2011, 15:30 [#49]:
Цитата (Ham_ele_on):
А TList можно сохранять(то есть, он в принципе сохраняется в файл??)? или надо как то по другому?
Нет, по-другому надо. Содержимое TList перегонять в TFileStream и всего делов!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
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™ (статус: Доктор наук), 21 февраля 2011, 19:52 [#51]:
Жуть какая! Я теперь всю ночь спать не буду.Зачем я это прочитал?!!..
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ham_ele_on (статус: Посетитель), 21 февраля 2011, 23:06 [#52]:
скажи где прочитать про "не жуть". а то я ищу то не знаю что.
|
|
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™ (статус: Доктор наук), 22 февраля 2011, 11:41 [#54]:
Цитата (Ham_ele_on):
отсюда просьба, посоветуй какой нибудь мануал по изучению делфи.
P\S. куда пиво прислать?
Мануал ищи в разделе "Библиотека". Рекомендую книжку "Delphi 5. Руководство разработчика". Очень хорошая вещь. Ну и, конечно, практики побольше. Пиши программы по любому поводу.
З.Ы. Пиво присылай на номер 8 920 991 12 99. Звонить туда бесполезно, это 3Ж-модем, но смски он принимает.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
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™ (статус: Доктор наук), 24 февраля 2011, 10:13 [#56]:
Цитата (Ham_ele_on):
в этом месте выдаёт ошибку.
Ошибку исправил, а также сделал загрузку.
Вот работающий исходник.
Цитата (Ham_ele_on):
вопрос такой, а если я захочу несколько TList в один файл сохранить??? я так понимаю, тут построчная запись в файл идёт, а как "границы" расставить???
Здесь немножко сложнее, но сделать можно. Сначала определись, как у тебя данные храниться будут, потом я скажу структуру файла.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ham_ele_on (статус: Посетитель), 24 февраля 2011, 10:29 [#57]:
>Здесь немножко сложнее, но сделать можно
понятно, потом видимо возникнет сложность при проверке данных.
оставлю как было, TList для сортировки, а данные в массив сохраняю.
спасибо за помощь, ещё один "инструмент" для себя открыл.
щас попробую разобраться как в TList и TStringList объекты сохранять.
ещё такой вопрос
X1:= Value1 and $FFFF;
Y1:= Value1 shr 16;
почему тут в Hex значения?
в таком варианте больше 5 знаков в числе не получается.
|
|
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]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|