Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2011, 22:32   #1
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию TStringList на лету

хочу выслушать критику по реализации построения строковых листов на лету

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
TStringList2 = class(TStringList);
TStringList = class(TStringList2)
    function v(s:string):TStringList;
end;
   TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TStringList }

function TStringList.v(s: string): TStringList;
begin
  self.Add(s);
  result:=self;
end;

function list:TStringList;
begin
    result:=TStringList.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(list.v('hello').v('BIG').v('world').Text);
end;

end.
при нажатии на кнопку формируется на лету, без объявления переменных
строковый лист list.v('hello').v('BIG').v('world') ,
потом выводится в сообщении в виде текста,

Однако, то что тут показано это всего лишь демонтрация работы а не прямое назначение сие метода, настоящее назначение заключается в упрощении передачи данных в пользовательские процедуры и функции, по средством ручного ввода данных через код программы.

hello
BIG
world
Lesha вне форума Ответить с цитированием
Старый 11.09.2011, 22:46   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Код:

uses Classes;

type
TStringList2 = class(TStringList);
TStringList = class(TStringList2)
Человек_Борща вне форума Ответить с цитированием
Старый 11.09.2011, 23:02   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

и потом еще утечки данных идут.

да и в примере TStringList не к чему.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.09.2011, 23:03   #4
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

Человек_Борща и?

стандартная реинициализация класса дельфи.

Цитата:
и потом еще утечки данных идут.
как проверить что их нет?
мониторить в диспетчере процесс, а саму программу заставить выполнять 100500 циклов с такими списками?

Последний раз редактировалось Lesha; 11.09.2011 в 23:05.
Lesha вне форума Ответить с цитированием
Старый 11.09.2011, 23:06   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
как проверить что их нет?
цикл тоже можно, но еще есть профайлеры.
а так я просто на глаз вижу, что в процедуре list список создан, а нигде не удален.

Человек_Борща, как я заметил, это маленький хак для расширения существующего класса.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.09.2011, 23:13   #6
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

Цитата:
в процедуре list список создан, а нигде не удален
этот список присваивается как результат вычислений, разве он потом не чиститься?
Lesha вне форума Ответить с цитированием
Старый 11.09.2011, 23:14   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Пепел Феникса,

Разве можно так делать?

Код:
uses Classes;

type
TStringList2 = class(TStringList);
TStringList = class(TStringList2)
Ведь TstringList уже обьявлен в Classes.pas!

Lesha, воспользуйтесь тем-же EurekaLog. Прекрасный экспер по отлову всяких ужасов....

TList является контейнером обьектов, а конкретно он представляет из себя массив указателей на обьктыкоторые ты там хранишь.
По этому ты сам в деструкторе должен позаботиться о том чтобы уничтожить все.

Если это напрягает. возьми TObjectList(наследник Tlist) из модуля contrs.pas, он обладает свойство автоматически уничтожить все, что в него запихали...

Последний раз редактировалось Человек_Борща; 11.09.2011 в 23:17.
Человек_Борща вне форума Ответить с цитированием
Старый 11.09.2011, 23:17   #8
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

Цитата:
Разве можно так делать?
а что мешает?

так кстати можно еще "свои" компоненты писать. Перезаписываеш стандартный класс и добаляеш туда свои методы.
И такой компонент установки не требует. Нужен только модуль который изменит базовые свойства.

Последний раз редактировалось Lesha; 11.09.2011 в 23:20.
Lesha вне форума Ответить с цитированием
Старый 11.09.2011, 23:19   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Ведь TstringList уже обьявлен в Classes.pas!
и что? в другом модуле же.
Цитата:
разве он потом не чиститься?
а вы где то вызываете Free?
Цитата:
TList является контейнером обьектов, а конкретно он представляет из себя массив указателей на обьктыкоторые ты там хранишь.
По этому ты сам в деструкторе должен позаботиться о том чтобы уничтожить все.
тут уже TStringList за основу взят, он тоже сам чистить за собой, но его самого надо сначало уничтожить, чтоб он почистил.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.09.2011, 23:25   #10
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

да, память жрет действительно

for i := 0 to 100000 do
list.v('hello').v('world');

Последний раз редактировалось Lesha; 11.09.2011 в 23:30.
Lesha вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка наличия в базе на лету BloodWizard JavaScript, Ajax 1 12.08.2010 19:34
AJAX выполнение Javascript на лету Egych JavaScript, Ajax 0 29.05.2009 23:50
Запрос mysql - создать массив на лету. iankov SQL, базы данных 0 24.01.2009 12:01
Изменение стилей окна на лету. Ivan_32 Win Api 1 29.12.2008 09:53
Создание кнопок на лету gabin Компоненты Delphi 2 11.05.2008 15:30