Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.02.2013, 06:18
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Обработка record'ов

Здравствуйте. Я с очередной глупой задачей.

Есть у меня целая пачка рекордов, вида
Код:
TMyRec = record
Name:string;
Value:string;
end;

tMyRecs = array of TMyRec;

которые служат для разных задач. Но смысл у них одинаковый - они хранят сопоставимые данные (определенному Name соответствует определенный Value). Есть для каждого такого рекорда классы, которые в том числе осуществляют поиск Value по введенному Name. Если честно, мне ужасно надоело копипастить код поиска. Хотелось бы как то замутить УНИВЕРСАЛЬНУЮ функцию, в которую я отправлю массив TMyRecs или ссылку на него, поле для поиска и значение поиска, а она бы вернула мне индекс нужного элемента массива. Но я не знаю как передать в функцию поле для поиска. Может, к полям в рекорде можно обращаться по индексу или еще как-нибудь?
Ответить с цитированием
  #2  
Старый 25.02.2013, 06:43
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от morebeauty
Хотелось бы как то замутить УНИВЕРСАЛЬНУЮ функцию, в которую я отправлю массив TMyRecs или ссылку на него, поле для поиска и значение поиска, а она бы вернула мне индекс нужного элемента массива. Но я не знаю как передать в функцию поле для поиска. Может, к полям в рекорде можно обращаться по индексу или еще как-нибудь?

А чем стандартный TStringList в режиме Name=Value не устраивает?
Код:
var
  L  :TStringList;
begin
  L := TStringList.Create;
  L.Values['aaa'] := 'aaa';
  L.Values['bbb'] := 'bbb';
  L.Values['ccc'] := 'ccc';

  ShowMessage(L.Values['bbb']);

  L.Free;
end;
Ответить с цитированием
  #3  
Старый 25.02.2013, 06:53
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
А чем стандартный TStringList в режиме Name=Value не устраивает?
Тем, что кроме Name и Value там может быть еще множество разных полей.
Ответить с цитированием
  #4  
Старый 25.02.2013, 08:46
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

По сути меня бы вполне устроил _recordset, но я не знаю как в него писать. Только как считывать и как получать его с запросов из БД.
Ответить с цитированием
  #5  
Старый 25.02.2013, 09:11
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от morebeauty
По сути меня бы вполне устроил _recordset, но я не знаю как в него писать. Только как считывать и как получать его с запросов из БД.

Ну, если _recordset устраивает, то см в сторону TClientDataSet. Его можно использовать для базоподобного хранилища без базы. Еще есть куча TMemTable-подобных компонентов. Там вообще чисто в памяти все хранится, а интерфейс TDataSet. (Я пользуюсь таким компонентом от DevExpress, благо либа стоит.)

Ну и, соответсвенно, классический вариант. Создаешь базовый класс для своих записей. В нем объявляешь метод сравнения с образцом. Далее создаешь класс для хранения списков твоих классов-записей. В нем пишешь свой метод поиска один раз, но через использование того абстрактного метода в базовом классе для записей. Теперь, при необходимости создать новый тип записи, наследуешься от базового класса и реализуешь только метод получения значения/сравнения. Кстати, если "подтянуть" RTTI, то на нем можно этот метод реализовать прямо в базовом классе. Тогда надо будет наследоваться только для описания структуры записей (набора полей). Но я так делать не люблю. Все-таки RTTI не так быстра, как просто вызов виртуального метода, а написать небольшой кусочек кода не так и сложно.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
morebeauty (25.02.2013)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:03.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter