Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.08.30;
Скачать: [xml.tar.bz2];

Вниз

как организовать Имя = Значение в CheckListBox   Найти похожие ветки 

 
Neket   (2009-06-29 16:33) [0]

Добрый день. Подскажите как организовать в CheckListBox что-то типа Имя = значение. А именно, к примеру есть CheckListBox1 такого плана
_
|_| Имя1
_
|_| Имя2
_
|_| Имя3

И если я ставлю галочку на любом из этих имен у меня выскакивает OpenDialog и мне нужно организовать присвоение пути к файлу выбранному имени... Т.е. Имя2 = С:\KillAll.bat


 
Palladin ©   (2009-06-29 16:39) [1]

1. Завести TStringList соответствий
2. Использовать Objects у Items:TStrings


 
Neket   (2009-06-29 16:51) [2]

А можно поподробнее? Я уже подумывал на эту тему но как имеено это реализовать недопонял. плз подскажите


 
123321   (2009-06-29 16:53) [3]

вот так вроде? или нет?
procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);
var
 ss: string;
begin
 case CheckListBox1.ItemIndex of
   0: ss:="C:\killall.bat";
   1: ss:="C:\kill_ne_all.bat";
   2: ss:="C:\kill.bat";
   else: ss:="C:\killall.bat";
 end;
 OpenDialog1.FileName:=ss;
 if OpenDialog1.Execute then ShowMessage(OpenDialog1.FileName);
end;


 
Neket   (2009-06-29 17:20) [4]

Неее нужно наоборот...

_
|_| Сканы паспорта
_
|_| Сканые пенсионко
_
|_| Другое

Поставили галочку к примеру на "Сканы паспорта"  вылетает Опендиалог и
FNAME присваивается  CheckListBox1.Items.Какое_нибудь_свойство.[CheckListBox1.ItemIndex] где (FNAME:=OpenDialog1.FileName)


 
clickmaker ©   (2009-06-29 18:30) [5]

Items.Objects
присвоить можно что угодно, не забыв выделить память в куче и освободить потом


 
Neket   (2009-06-29 19:08) [6]

Эммм ну дайте кусочек кода ПЛЗ


 
Юрий Зотов ©   (2009-06-29 19:54) [7]

Проще завести массив строк или еще один TStrings.


 
sniknik ©   (2009-06-29 20:41) [8]

> не забыв выделить память в куче и освободить потом
использовать строки, и заботится об этом не будет нужды, главное чтобы они были глобальными или константами, ну и не менять их через переменную после присвоения "адреса". (зачем и почему пусть сам разберется).

> Проще завести массив строк или еще один TStrings
не, с Items.Objects все таки проще

procedure TForm1.FormCreate(Sender: TObject);
begin
 with CheckListBox1.Items do begin
   AddObject("Имя1", TObject(PChar("С:\rillAll.bat")));
   AddObject("Имя2", TObject(PChar("С:\kill_ne_all.bat")));
   AddObject("Имя3", TObject(PChar("С:\kill.bat")));
   AddObject("Имя4", TObject(PChar("С:\kill_simple_kill.bat")));
 end;  
end;

procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);
begin
 with TCheckListBox(Sender) do
   ShowMessage(PChar(Items.Objects[ItemIndex]));
end;


и все, а со вторым TStrings еще синхронизироваться постоянно


 
Neket   (2009-06-29 20:48) [9]

Спасибо огромное


 
Юрий Зотов ©   (2009-06-29 22:29) [10]

> sniknik ©   (29.06.09 20:41) [8]

Какие глобальные? Какие константы? Это же OpenDialog.FileName.


 
sniknik ©   (2009-06-29 22:47) [11]

> Какие глобальные? Какие константы?
те которые пойдут туда -> AddObject("Имя1", TObject(PChar("С:\rillAll.bat")));
а OpenDialog.FileName тут совсем не причем.


 
sniknik ©   (2009-06-29 23:01) [12]

p.s. если против то попробуй так использовать локальные переменные строк, и посмотри что будет.
(строки обязательно, т.к. именно я их предлагал для автоматизации, когда говорил, что можно избежать выделения памяти/освобождения при использовании Items.Objects)
p.p.s. откуда ты OpenDialog.FileName взял, не понятно, я его вообще не упоминал. не, можно конечно и в нем "сохраненную" так строку использовать, но это не принципиально, можно и для другого. тема то не про то как она будет использоваться, она про то как "организовать".


 
Юрий Зотов ©   (2009-06-30 00:09) [13]

> sniknik ©   (29.06.09 23:01) [12]
> откуда ты OpenDialog.FileName взял

Из сабжа, вестимо. Поэтому и говорю - чревато глюками. StringList для начинающих проще и надежнее.


 
Германн ©   (2009-06-30 01:17) [14]


> StringList для начинающих проще и надежнее.

+1
Тем более что из сабжа никак не следует необходимость "синхронизации" двух списков строк..
P.S. Странно что Тимур отмалчивается. :)


 
sniknik ©   (2009-06-30 01:31) [15]

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

> Тем более что из сабжа никак не следует необходимость "синхронизации" двух списков строк..
необходимость синхронизации следует из того простого факта, что списков будет 2 один в компоненте другой для значений, а значит и значения в них добавлять/удалять нужно строго синхронно чтобы индексы(номер в списке) совпадали.


 
Германн ©   (2009-06-30 01:55) [16]


> sniknik ©   (30.06.09 01:31) [15]

Коль, В "Начинающих" никто не думает о добавлении/уничтожении в рантайме, если это не сказано явно в сабже или в пояснении сабжа.
Было бы раньше и не в "Начинающим" я бы тоже дал такой совет.


 
Neket   (2009-06-30 09:12) [17]

В данном случае я воспользовался свойством Objects Так как на мой взягляд это очень практично преминимо моего случая.

Код для тех кому вдруг понадобиться (Такимже нубам как и я :-)  )
type
TMyObject = class (TObject)
public
 s:string;
end;

procedure TForm1.c1ClickCheck(Sender: TObject);
begin
 c1.Items.Objects[c1.ItemIndex]:=TMyObject.Create;
 with c1.Items.Objects[c1.ItemIndex] as TMyObject do
   begin
    s:="lalala"+inttostr(c1.ItemIndex);
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
 for i:=0 to c1.Items.Count-1 do
   if c1.Checked[i] then
    ShowMessage(TMyObject(c1.Items.Objects[i]).s);
end;

соответсвенно очистка осуществляется c1.Items.Objects[c1.ItemIndex].Free;

На мой взгляд удобно и понятно.


 
sniknik ©   (2009-06-30 09:30) [18]

procedure TForm1.c1ClickCheck(Sender: TObject);
begin
 c1.Items.Objects[c1.ItemIndex]:=TMyObject.Create;
 with c1.Items.Objects[c1.ItemIndex] as TMyObject do
   begin
     s:="lalala"+inttostr(c1.ItemIndex);
   end;
end;

что будет если на "чекбар" в c1 нажмут 2 раза, 3, 10, и т.д. ?


 
Neket   (2009-06-30 09:34) [19]

Не ну эт я предусмотрел.
если галку ставят то идет CREATE если галку снимают то идет FREE

If (CheckListBox1.Checked[CheckListBox1.ItemIndex]=false) Then
                                                         begin
                                                         if Assigned(CheckListBox1.Items.Objects[CheckListBox1.ItemIndex]) then CheckListBox1.Items.Objects[CheckListBox1.ItemIndex].Free;
                                                         end;


 
sniknik ©   (2009-06-30 09:47) [20]

1 Assigned работает только если переменная "пустая", т.е. по твоему коду 1 раз.
а нажатий например 10. и ???
2 Free, да и любой другой метод вызванный у разрушенного обьекта приводит к AV. если обьект освобожден но в памяти еще не перезаписан другими данными. то AV может и не быть, что даст иллюзию нормальной работоспособности, но ???

гораздо проще и надежнее создавать обьект 1 раз, предварительно проверив есть он там или нет. и все.


 
Neket   (2009-06-30 09:50) [21]

Что значит несколько раз?  В моем случае одно исключает другое.
Поставили галку создали объект, убрали галку уничтожили объект. Подругому быть не может.
Ну и как показывает практика, все прекрасно работает


 
sniknik ©   (2009-06-30 10:11) [22]

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

> Ну и как показывает практика, все прекрасно работает
практика без теории приводит к печальным результатам. вот как здесь например. якобы правильно работает но почему не понял, а стоит такую же конструкцию в другом месте использовать, где проверка на Assigned будет значима (от нее будет что-то зависеть), и будет новый вопрос на форуме типа "в одном месте работает в другом нет хотя код одинаковый... почему?".


 
Neket   (2009-06-30 10:23) [23]

Ок... Ваш варинт. Правильный. Прошу в "Студию" Интересно


 
{RASkov} ©   (2009-06-30 10:35) [24]

> [21] Neket   (30.06.09 09:50)
> Поставили галку создали объект, убрали галку уничтожили объект

Это логически не верно. Т.е. со стороны логике программы - верно, а со стороны программиста - нет.
Через месяц внесешь изменения в код и всё.... прощай логика..... нифика не работает, а почему? Потому что программист писал по принципу: Работает сейчас ну и пусть работает, а что там не так мне покакать.


> [23] Neket   (30.06.09 10:23)
> Ок... Ваш варинт. Правильный. Прошу в "Студию" Интересно

Неужели из сказанного выше нет соображений на верный код??? :)


 
sniknik ©   (2009-06-30 10:59) [25]

> Ок... Ваш варинт.
это не мой вариант, это твой только поправленный. я бы в данном случае вообще не делал созданий/уничтожений в процессе работы программы, а создал бы все обьекты списка при старте проги. (не такие уж они "напряжные" чтобы на них экономить)

procedure TForm1.c1ClickCheck(Sender: TObject);
begin
 with CheckListBox1 do
   if not Assigned(Items.Objects[ItemIndex]) then begin  
     Items.Objects[ItemIndex]:= TMyObject.Create;
     with Items.Objects[ItemIndex] as TMyObject do
       s:="lalala"+inttostr(c1.ItemIndex);
   end;
end;


а ошибку в твоем коде можно увидеть так -
к примеру у тебя есть/будут "общие" кнопки, как иногда делают, "очистить все", "установить все", ну вот пример установки для одного пункта (на нем пробуем), гденибудь по кнопке например делаешь  
CheckListBox1.Checked[0]:= true;
допустим ты уже нажимал пункт отдельно, и установил/снял галку с этого пункта, т.е. объект создавался, был освобожден, но ссылка на него осталась (само собой, ты же не обнуляешь ссылку)
объект может разрушится по естественным причинам, делаем эмуляцию этого, чтоб не ждать, там же по кнопке
CheckListBox1.Items.Objects[0]:= TObject(PChar("doError"));
следующее нажатие вызовет AV, т.к. проверка chek у тебя сбилась из-за "ручного" изменения, а Assigned не сработал.

причем ошибка будет редкой, трудноуловимой, непонятно от каких действий (ни один юзер тебе последовательность не запомнит), и возникнет только тогда когда программа "разрастется" там появятся дополнительные пункты (типа "отметить все"), будет использоваться много памяти, и станет трудной в отладке, т.к. в отладке те же действия повторенные сразу (обьект может еще не разрушится) AV не дадут...


 
sniknik ©   (2009-06-30 11:12) [26]

> CheckListBox1.Items.Objects[0]:= TObject(PChar("doError"));
вот это лучше заменить на это -
PInteger(CheckListBox1.Items.Objects[0])^:= 1234;

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


 
Jungle ©   (2009-06-30 11:21) [27]

sniknik
В твоём примере действие
s:="lalala"+inttostr(c1.ItemIndex);
выполняется только один раз. А судя по условиям задачи оно должно меняться при каждом "чеке", когда выбирается имя файла.
Но в этом случае нужно ещё быть уверенным, что Objects[N] является объектом типа TMyObject.


 
sniknik ©   (2009-06-30 11:31) [28]

> В твоём примере действие
это не мой пример, это, еще раз повторю, исправленный пример самого автора вопроса. "оригинал" можешь найти немного выше, частями в [17] и [19].

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

> Но в этом случае нужно ещё быть уверенным, что Objects[N] является объектом типа TMyObject.
с проектом работает несколько человек, и один не ведает что туда вносит другой? какая еще нужна уверенность?


 
Neket   (2009-06-30 11:34) [29]

Хмм... Интресно... Спасибо. впитал. Бум исправляться. Хотя в моем случае можно былобы и остановиться на том что есть ибо так глубоко я лезть не буду, но я впринципе являюсь сторонником универсальности и корректности. Поэтому из принципа внесу изменения. Ещё раз все спасибо.


 
brother ©   (2009-06-30 11:35) [30]

> но я впринципе являюсь сторонником универсальности и корректности.
> Поэтому из принципа внесу изменения.

не из принцыпа, а так правильно


 
sniknik ©   (2009-06-30 11:36) [31]

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


 
Neket   (2009-06-30 11:43) [32]

как всегда концовка радует... "ВСЕ В САД" )))) Всеравно спасибо


 
sniknik ©   (2009-06-30 11:58) [33]

> как всегда концовка радует... "ВСЕ В САД" )))) Всеравно спасибо
ну, это в общем то  не тебе, это продолжение ответа для Jungle.

тебя я изначально не считал неспособным разобраться, хотя меня и остерегали, что надо писать как для начинающих.
(вот если бы ты не привел код, и/или начал бы в ответ нести что-то неадекватное, то тогда что-то подобное [31] было бы лично для тебя, а так нет)


 
sniknik ©   (2009-06-30 11:59) [34]

> тебя я изначально не считал
я вообще изначально никого не считаю... разве что если с первого же поста начинают нести "неадекват".


 
Neket   (2009-06-30 12:01) [35]

Спасибо.... Может просто неумею сразу корректно объяснить проблему )))



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.08.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.006 c
2-1246352665
Цукор5
2009-06-30 13:04
2009.08.30
Сокеты. Заполнение структуры адреса сервера


15-1246212338
vuk
2009-06-28 22:05
2009.08.30
Москва. Печать на цветном лазернике. Где?


2-1246192670
Guest___
2009-06-28 16:37
2009.08.30
Сравнить значение Мемо с заданым


2-1246604370
Neket
2009-07-03 10:59
2009.08.30
Как узнать колличество записей в DBGrid?


15-1246370688
Пит
2009-06-30 18:04
2009.08.30
WEB <-> Настройки <-> БД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский