![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Строку в объект [D7, XP]
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/можно отнести к классу правильного использования записей для хранения строковых данных?