Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Посоветуйте класс похожий на TStringList, но для пар строк (если такое есть) 
:(
    Опции темы
Ibragim
Дата 26.12.2006, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



Добрый вечер.
Насоветуйте, может не стоит изобретать велосипед - может уже есть такое.

Нужен класс, с функционалом TStringList, а именно
- быстрая и удобная загрузка/сохранение в файл
- быстая сортировка, уже реализована
- если список сортирован, то Add добавляет в соответствующее место а не в конец списка.
- удобный вывод, например в TStringGrid  (MyStringGrid.Strings[0] := MyStringList;)

Мне же нужно такое же, только для ПАР строк. Чтобы не писать самому сортировки по столбцу 1 и 2, загрузка-сохранение в цикле и т.п.

Кто знает (если такое есть) - подскажите плз.
PM MAIL   Вверх
Fedia
Дата 26.12.2006, 06:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 8
Всего: 13



Три варианта:
1. Строки в TStringList заносить с разделителем типа: 'поле1|поле2' (не удобен для сортировки по второму полю).
2. Использовать два объекта TStringList. При сохранении строки второго стринглиста добавлять в первому.
3. Написать наследника от класса  TStringList (отношение типа "иметь").
ЗЫ: готовое решение едва ли удастся найти.


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Akella
Дата 26.12.2006, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



у TStringList это реализовано, смотри свойства Names и Values
стандартный разделитель, помоему, знак равно (=)

Код

procedure TForm4.Button1Click(Sender: TObject);
Var
 s:TStringList;
 Name, Val: string;
 i:integer;
begin
 s:=TStringList.Create;
 try
     s.LoadFromFile('c:\11.txt');
     {
     #формат файла:
     поле=значение
     поле=значение
     поле=значение
     поле=значение
     поле=значение
     поле=значение
     }
     For i:= 0 to s.Count-1 do
       ShowMessage('Название поля: '+s.Names[i]+#13#10+ 'значение: '+s.Values[i]);
 finally
   FreeAndNil(s);
 end;

end;



Это сообщение отредактировал(а) Akella - 26.12.2006, 09:06
PM MAIL   Вверх
Teran
Дата 26.12.2006, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 590
Регистрация: 9.9.2005
Где: Украина, Запорожь е

Репутация: нет
Всего: 3



Цитата(Fedia @  26.12.2006,  06:18 Найти цитируемый пост)
ЗЫ: готовое решение едва ли удастся найти.

record + TList = готовое решение


--------------------
Ни цего не понимаю
PM MAIL ICQ   Вверх
Mephisto
Дата 26.12.2006, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 1
Всего: 34



Цитата(Ibragim @  26.12.2006,  03:30 Найти цитируемый пост)
если список сортирован, то Add добавляет в соответствующее место а не в конец списка.

А чем insert не подходит?
Цитата(Akella @  26.12.2006,  09:43 Найти цитируемый пост)
стандартный разделитель, помоему, знак равно (=)

Можно установить через Delimiter.
Ibragim, думается твой вариант.  smile 
PM   Вверх
Ibragim
Дата 26.12.2006, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



Гуд, спасибо за советы, будем попробовать что ближе к сердцу ляжет. 
Похоже, проще всего Names и Values и TStringList. Но поэксперементируем
PM MAIL   Вверх
MetalFan
Дата 26.12.2006, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



а мне кажется самое оптимальное - это наследник от TList с необходимым функционалом... естесьно самописный

Это сообщение отредактировал(а) MetalFan - 26.12.2006, 13:38


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
aktuba
Дата 26.12.2006, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Полностью поддерживаю Metalfan-а. Это самый правильный путь, да и если в будущем понадобится улучшения - TList просто необходим.


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Ibragim
Дата 26.12.2006, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



Цитата(MetalFan @  26.12.2006,  13:38 Найти цитируемый пост)
TList с необходимым функционалом


Не факт что TList. Вполне возможно TStringList. Тогда дописать только обращение к первой-второй части строки, и все. Хотя остаются проблемы с выводом....

PS 

Akella, s.Values[i] работать не будет. Там в квадратных скобках имя надо писать. Поэтому в несортированых списках тормозиииить должно немерянно. Хотя сам не пробовал.

В общем, всем спасибо за отзывы, будем работать smile 
PM MAIL   Вверх
Akella
Дата 26.12.2006, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(Ibragim @  26.12.2006,  15:36 Найти цитируемый пост)
Akella, s.Values[i] работать не будет. Там в квадратных скобках имя надо писать.

а как на счёт
Код

s.ValueFromIndex[i];


PM MAIL   Вверх
aktuba
Дата 26.12.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Ibragim - не только с выводом, но и с сортировкой по столбцам. Лучше все-таки TList.


--------------------
user posted image
PM MAIL WWW Skype   Вверх
MetalFan
Дата 26.12.2006, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



накидал тут за 20 минут для обчего развития примитивный примерчик
Код

interface

uses
   classes, contnrs;

type

  TRowList = class;

  TRowItem = class
  private
    FStringList: TStringList;
    FParent: TRowList;
    function GetColCount: Integer;
    procedure SetColCount(const Value: Integer);
    function GetCol(AIndex: Integer): string;
    procedure SetCol(AIndex: Integer; const Value: string);
  protected
    property ColCount: Integer read GetColCount write SetColCount;
  public
    constructor Create( AParentList: TRowList; AColCount: Integer );
    destructor Destroy; override;
    property Col[ AIndex: Integer ]: string read GetCol write SetCol;
    function AsText( ADelimiter: Char = ',' ): string;
  end;

  TRowList = class
  private
    FList: TObjectList;
    FColCount: Integer;
    function GetCell(ACol, ARow: Integer): string;
    function GetRow(AIndex: Integer): TRowItem;
    procedure SetCell(ACol, ARow: Integer; const Value: string);
    function GetColCount: Integer;
    procedure SetColCount(const Value: Integer);
    function GetRowCount: Integer;
    procedure SetRowCount(const Value: Integer);
  public
    constructor Create;
    destructor Destroy; override;
    function AddRow( ARow: TRowItem ): Integer; overload;
    function AddRow(): TRowItem; overload;
    property Rows[ AIndex: Integer]: TRowItem read GetRow;
    property RowCount: Integer read GetRowCount write SetRowCount;
    property ColCount: Integer read GetColCount write SetColCount;
    property Cell[ ACol, ARow: Integer]: string read GetCell write SetCell;
    function AsText( AColDelim: Char = ','; const ARowDelim: string = sLineBreak): string;
  end;

implementation

{ TRowItem }

function TRowItem.AsText(ADelimiter: Char): string;
begin
  FStringList.Delimiter := ADelimiter;
  Result := FStringList.DelimitedText;
end;

constructor TRowItem.Create( AParentList: TRowList; AColCount: Integer );
begin
  FStringList := TStringList.Create;
  ColCount := AColCount;
end;

destructor TRowItem.Destroy;
begin
  FStringList.Free;
  inherited;
end;

function TRowItem.GetCol(AIndex: Integer): string;
begin
  Result := '';
  if (AIndex >=0) and (AIndex < ColCount) then
    Result := FStringList[AIndex];
end;

function TRowItem.GetColCount: Integer;
begin
  Result := FStringList.Count;
end;

procedure TRowItem.SetCol(AIndex: Integer; const Value: string);
begin
  if (AIndex <0) or (AIndex >= ColCount) then Exit;
  FStringList[AIndex] := Value;
end;

procedure TRowItem.SetColCount(const Value: Integer);
begin
  if Value < 0 then Exit;
  if Value > FStringList.Count then
    while Value > FStringList.Count do
      FStringList.Add('')
  else
  if Value < FStringList.Count then
   while Value < FStringList.Count do
     FStringList.Delete(FStringList.Count-1)
end;

{ TRowList }

function TRowList.AddRow: TRowItem;
var
  lRow: TRowItem;
begin
  Result := nil;
  lRow := TRowItem.Create( Self, FColCount );
  if AddRow( lRow ) <> -1 then
    Result := lRow;
end;

function TRowList.AddRow(ARow: TRowItem): Integer;
begin
  Result := FList.Add( ARow )
end;

constructor TRowList.Create;
begin
  FList := TObjectList.Create( True );
end;

destructor TRowList.Destroy;
begin
  FList.Free;
  inherited;
end;

function TRowList.AsText(AColDelim: Char;
  const ARowDelim: string): string;
var
  i: Integer;
begin
  Result := '';
  for i := 0 to pred( RowCount ) do
    Result := Result + Rows[i].AsText( AColDelim ) + ARowDelim;
end;

function TRowList.GetCell(ACol, ARow: Integer): string;
begin
  Result := Rows[ARow].Col[ACol];
end;

function TRowList.GetColCount: Integer;
begin
  Result := FColCount;
end;



function TRowList.GetRow(AIndex: Integer): TRowItem;
begin
  Result := TRowItem( FList[AIndex] );
end;

function TRowList.GetRowCount: Integer;
begin
  result := FList.Count;
end;

procedure TRowList.SetCell(ACol, ARow: Integer; const Value: string);
begin
  Rows[ARow].Col[ACol] := Value;
end;

procedure TRowList.SetColCount(const Value: Integer);
var
  i: Integer;
begin
  if FColCount = Value then exit;
  for i := 0 to pred( RowCount ) do
    Rows[i].ColCount := Value;
  FColCount := Value;
end;

procedure TRowList.SetRowCount(const Value: Integer);
begin
  if Value < 0 then Exit;
  if RowCount < Value then
    while RowCount < Value do
      AddRow
  else
  if RowCount > Value then
    while RowCount > Value do
      FList.Delete( RowCount-1 );
end;


сортировку сам прикрутишь, я думаю)

пример использования:
Код

var
  i, j: Integer;
  lRCount, lCCount: Integer;
  lRowList: TRowList;
  lText: string;
  lRect: TRect;  
begin
  Randomize;
  lRCount := Random( 10 )+5;
  lCCount := Random( 10 )+5;
  lRowList := TRowList.Create;
  try
    lRowList.ColCount := lCCount;
    lRowList.RowCount := lRCount;
    for i := 0 to pred( lRCount ) do
      for j := 0 to pred( lCCount ) do
        lRowList.Cell[j, i] := IntToStr( Random(100));
    lText := lRowList.AsText('*');
    lRect := Self.ClientRect;
//    OffsetRect( lRect, 10, 150 );
    Self.Canvas.FillRect(lRect);
    DrawText( Self.Canvas.Handle, PChar(lText), length( lText), lRect, DT_LEFT or DT_NOCLIP)
  finally
    lRowList.Free;
  end;

end;




--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1316 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.