Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Строку в объект [D7, XP]


Страницы:   1 2 3 4 5 6

kyn66 ©   (2009-11-12 16:11:00) 

Подскажите, каким способом можно строку вставить в объект , ну например ComboBox ? Нужно к примеру просканировать текущий каталог диска, найденные файлы записать в Combobox, а полный путь к файлу сохранить в объекте. Помню со строками есть проблемы при сохранении в объект. Есть вот такой вариант

....
var
 PS: PString;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
 new(PS);
 PS^ := 'Hello world 1';
 ComboBox1.Items.AddObject('Item1', TObject(PS));
 PS^ := 'Hello world 2';
 ComboBox1.Items.AddObject('Item2', TObject(PS));
 PS^ := 'Hello world 3';
 ComboBox1.Items.AddObject('Item3', TObject(PS));
...

procedure TForm1.FormDestroy(Sender: TObject);
begin
 Dispose(PS);
end;


При доступе к объекту

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
 ShowMessage(PString(Combobox1.Items.Objects[0])^); //Hello world 1
end;


возникает ошибка (AV)


Дмитрий Белькевич   (2009-11-15 21:16:00) [41]


> Берем из объекта поле записи типа Integer и юзаем его :)


Если нужен и Integer (для последующего его применения) и строчка (для отображения) то строчка запихивается в комбобокс, integer - в указатель:

AddObject(s, Pointer(i))

>Поправде говоря к указателям раньше ваще никогда не приходилось обращаться. А сейчас просто чисто из интереса. Хочется все же понять что это такое.

Жаль только применение крайне неудачное.

Понять указатели? Ну можешь мои статьи посмотреть:

http://www.makhaon.com/articles/


Юрий Зотов   (2009-11-15 10:34:00) [42]

> kyn66 ©   (15.11.09 02:33) [62]

> к указателям раньше ваще никогда не приходилось обращаться. А сейчас
> просто чисто из интереса. Хочется все же понять что это такое.

Дык... а что там понимать? Указатель - это переменная, содержащая адрес. Только и всего.

Кстати, длинные строки, динамические массивы, объекты - все это тоже указатели.


  (2009-11-15 03:02:00) [43]

Удалено модератором


Германн   (2009-11-15 02:47:00) [44]


>
> Работа с простыми строками уже как бы известный механизм.
>  Хотелость попробывать изучить работу объектов. Поправде
> говоря к указателям раньше ваще никогда не приходилось обращаться.
>  А сейчас просто чисто из интереса.

Тогда читай книги (учебники).


kyn66   (2009-11-15 02:33:00) [45]


> Функция - одна, принимающая разделитель и строку на вход
> и отдающая одну или две части. Пишется минут за 5.


Я не сказал что это сложно. К тому же у RX есть хороший набор функций по работе со строками.


> Так это и у тебя нужно. Как же ты собираешься сразу числовой
> тип отображать? :)


Берем из объекта поле записи типа Integer и юзаем его :)


> Ну так большая часть и отсюда: http://govnokod.ru/вполне
> работает.


:)


> А в случае бех объектов даже инициализировать/уничтожать
> ничего не нужно :)


Работа с простыми строками уже как бы известный механизм. Хотелость попробывать изучить работу объектов. Поправде говоря к указателям раньше ваще никогда не приходилось обращаться. А сейчас просто чисто из интереса. Хочется все же понять что это такое.


Дмитрий Белькевич   (2009-11-15 01:31:00) [46]

> Все.

А в случае бех объектов даже инициализировать/уничтожать ничего не нужно :)

>то здесь тоже не обойдется без дополнительных функций по извлечению и показу нужной части строки

Функция - одна, принимающая разделитель и строку на вход и отдающая одну или две части. Пишется минут за 5.

>преобразованию к нужным типам данных (если числовой)

Так это и у тебя нужно. Как же ты собираешься сразу числовой тип отображать? :)

>Механизм работает, утечки памяти отсутствуют.

Ну так большая часть и отсюда: http://govnokod.ru/вполне работает.


kyn66   (2009-11-14 20:02:00) [47]


> Дмитрий Белькевич   (13.11.09 23:20) [57]


Ну тут уже подумать нужно что проще. Если все делается на одной форме и работаем с объектами, то в нужном месте их инициализируем, получаем/присваиваем данные, при закрытии формы уничтожаем. Все. Если же работать с частями строк[17], то здесь тоже не обойдется без дополнительных функций по извлечению и показу нужной части строки, извлечению, преобразованию к нужным типам данных (если числовой) и т.д. Т.е. в любом варианте есть свои нюансы. А если известен механизм, то уже можно придумать куда и как лучше его применить. Кстати, проверил отработку [56] совместно с AllocMemSize- все отлично. Механизм работает, утечки памяти отсутствуют. Что и требовалось получить в конечном итоге.


kyn66   (2009-11-14 18:06:00) [48]


> Leonid Troyanovsky ©   (13.11.09 23:51) [58]


Осталось правильно расставить

Begin

end;


Leonid Troyanovsky   (2009-11-13 23:51:00) [49]


> kyn66 ©   (13.11.09 17:52) [52]

> УмнО от мастера такое слышать. Не у одного меня такие проблемы

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

New&Free - где ж твой букварь?

--
Regards, LVT.


Дмитрий Белькевич   (2009-11-13 23:20:00) [50]

Я бы всё таки к [17] сколнялся. Слишком всё сложно - объекты, создание/разрушение, указатели, разыменовывание, следить за всем этим добром... Нафига? [17] - это две-три строки кода, безо всяких излишест.

В ComboBox1DrawItem что-то типа TextOut(Rect.Left,Rect.Top, ExtractFileName(Items[Index]));

Для общего случая вместо ExtractFileName можно каку-то другую функцию сделать, выделяющую нужный для отображения кусок строки.


kyn66   (2009-11-13 20:41:00) [51]

Я думаю [53] следуе добавить очистку ComboBox после уничтожения объектов.

  for I := 0 to ComboBox1.Items.Count - 1 do
    Dispose(PNameOldsRec(ComboBox1.Items.Objects[I]));
  ComboBox1.Clear;


В противном случае

with PNameOldsRec(ComboBox1.Items.Objects[I])^ do
    ShowMessageFmt('Name: %s; Olds: %d', [Name, Olds]);

всеравно выполняется, но с мусором. Проверял разделив этот кусок кода   procedure TForm2.Button1Clickна три раздельных для последовательности действий.

procedure TForm1.Button2Click(Sender: TObject);
begin
ComboBox2.Items.AddObject('Первая строка Комбо', CombineNameAndOlds('Строка 1', 1));
ComboBox2.Items.AddObject('Вторая строка Комбо', CombineNameAndOlds('Строка 2', 2));
end;

procedure TForm1.ComboBox2Change(Sender: TObject);
begin
 with PNameOldsRec(ComboBox2.Items.Objects[ComboBox2.ItemIndex])^ do
  ShowMessageFmt('Name: %s; Olds: %d', [Name, Olds]);
end;

procedure TForm1.Button3Click(Sender: TObject);
Var
 i : Integer;
begin
 for I := 0 to ComboBox2.Items.Count - 1 do
  Dispose(PNameOldsRec(ComboBox2.Items.Objects[I]));
 ComboBox2.Clear;
end;

Да и пустая добавляемая строка сперва сбила с толку, почему комбо пустой получается... ComboBox1.Items.AddObject('', CombineNameAndOlds('Строка 1', 1));

А так все прэлесно... :)


kyn66   (2009-11-13 20:06:00) [52]


> zlo   (13.11.09 18:16) [53]


Спасибо тебе, добрый человек! Это похоже на мои мысли [49] + [50], только оформлено более аккуратнее. Отлично. Сейчас проверю в деле...

ЗЫ:
Ник совсем не подходит ;).


zlo   (2009-11-13 18:18:00) [53]

забыл убрать var P: PNameOldsRec;из CombineNameAndOlds


zlo   (2009-11-13 18:16:00) [54]


type
 PNameOldsRec = ^TNameOldsRec;
 TNameOldsRec = record
   Name: string;
   Olds: Integer;
 end;

function CombineNameAndOlds(AName: string; AOlds: Integer): TObject;
var
 P: PNameOldsRec;
begin
 New(PNameOldsRec(Result));
 with PNameOldsRec(Result)^ do
 begin
   Name := AName;
   Olds := AOlds;
 end;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
 I: Integer;
begin
 ComboBox1.Items.AddObject('', CombineNameAndOlds('Строка 1', 1));
 ComboBox1.Items.AddObject('', CombineNameAndOlds('Строка 2', 2));

 for I := 0 to ComboBox1.Items.Count - 1 do
   with PNameOldsRec(ComboBox1.Items.Objects[I])^ do
     ShowMessageFmt('Name: %s; Olds: %d', [Name, Olds]);

 for I := 0 to ComboBox1.Items.Count - 1 do
   Dispose(PNameOldsRec(ComboBox1.Items.Objects[I]));
end;


kyn66   (2009-11-13 17:52:00) [55]


> Leonid Troyanovsky ©   (13.11.09 17:39) [51]


УмнО от мастера такое слышать. Не у одного меня такие проблемы, млин...

http://www.cyberforum.ru/delphi-beginners/thread49246.html


Leonid Troyanovsky   (2009-11-13 17:39:00) [56]


> kyn66 ©   (13.11.09 16:10) [50]

> Проверил - все работает. Однако ошибка AV FreeObjects(ComboBox1.
> Items);// описана в [38].

Помылся б ты, ёжик.

--
Regards, LVT.


kyn66   (2009-11-13 16:10:00) [57]

Проверил - все работает. Однако ошибка AV FreeObjects(ComboBox1.Items);// описана в [38]. Объекты не правильно удаляю.
Скорее всего вот так правильно?

 for i := 0 to ComboBox1.Items.Count - 1 do
  Dispose(PMyRec(ComboBox1.Items.Objects[i]));


kyn66   (2009-11-13 15:51:00) [58]


> Григорьев Антон ©   (13.11.09 15:18) [48]
> Вроде никаких ошибок я там не вижу.
</I

Т.е. здесь и память правильно выделяется new(MyRec);, затем полю записи присваевается значение для "хранения" MyRec^.path:=OpenDialog1.FileName;и затем все грамотно высвобождается for i:=0 to ListView1.Items.Count-1 do
   Dispose(PMyRec(ListView1.Items[i].Data));
Здесь применительно к TListView. Значит если я хочу применить это к своему варианту с ComboBox(для него я думаю такая технология тоже подойдет) нужно сделать так(по типу [38])?


procedure TForm1.FormCreate(Sender: TObject);
begin
  new(MyRec);
   MyRec^.path:='FromObjectItem 1';
   ComboBox1.Items.AddObject('Item 1', Pointer(MyRec));
  new(MyRec);
   MyRec^.path:='FromObjectItem 2';
   ComboBox1.Items.AddObject('Item 2', Pointer(MyRec));
  new(MyRec);
   MyRec^.path:='FromObjectItem 3';
   ComboBox1.Items.AddObject('Item 3', Pointer(MyRec));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 FreeObjects(ComboBox1.Items);// описана в [38]
end;


Григорьев Антон   (2009-11-13 15:18:00) [59]


> kyn66 ©   (13.11.09 15:03) [47]

Вроде никаких ошибок я там не вижу.


kyn66   (2009-11-13 15:03:00) [60]

Вот этот пример http://k210.org/delphi/components/49/можно отнести к классу правильного использования записей для хранения строковых данных?


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо