|
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | ComboBox "tag" Fra : Mark S. Rasmussen |
Dato : 21-08-02 18:11 |
|
Hej alle.
Jeg har en ComboBox som jeg fylder med items fra min database. Hver række
har et unikt id, som jeg skal kunne hente, ud fra hvilken række brugeren har
valgt i min comboBox. I VB ville jeg kunne sætte hver item's tag property
til id'et. Men hvordan gør jeg i Delphi? Kan jeg give sådanne items nogle
usynlige værdier som jeg kan hente ud senere?
Jeg har også brug for samme funktionalitet til en ListBox, men det er vel
samme procedure som til en ComboBox.
Mvh Mark
--
www.improve.dk
| |
David A. D. Konrad (21-08-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : David A. D. Konrad |
Dato : 21-08-02 18:51 |
|
>Mark S. Rasmussen" <mark@tv.dk> skrev i en meddelelse
news:ak0hib$tvk$1@news.cybercity.dk...
> Hej alle.
>
> Jeg har en ComboBox som jeg fylder med items fra min database. Hver række
> har et unikt id, som jeg skal kunne hente, ud fra hvilken række brugeren
har
> valgt i min comboBox. I VB ville jeg kunne sætte hver item's tag property
> til id'et. Men hvordan gør jeg i Delphi? Kan jeg give sådanne items nogle
> usynlige værdier som jeg kan hente ud senere?
I TStrings, combobox.items-klassen, kan du sætte strengene som name=value.
Slå "names" og "values" op i hjælpen under TStrings - det er nok løsningen.
Der findes intet tag-felt til hver enkelt item i en TStrings [det er blot en
liste af strenge, og ikke objekter]
> Jeg har også brug for samme funktionalitet til en ListBox, men det er vel
> samme procedure som til en ComboBox.
Korrekt.
| |
Thomas Due (22-08-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : Thomas Due |
Dato : 22-08-02 09:13 |
|
"David A. D. Konrad" <david_konrad@hotmail.com> wrote in message
news:ak0ju5$5cb$1@sunsite.dk...
> > I VB ville jeg kunne sætte hver item's tag property
> > til id'et. Men hvordan gør jeg i Delphi? Kan jeg give sådanne items
nogle
> > usynlige værdier som jeg kan hente ud senere?
>
> I TStrings, combobox.items-klassen, kan du sætte strengene som name=value.
> Slå "names" og "values" op i hjælpen under TStrings - det er nok
løsningen.
> Der findes intet tag-felt til hver enkelt item i en TStrings [det er blot
en
> liste af strenge, og ikke objekter]
Alternativt kan man bruge Object propertien på hvert item.
F.eks. Combox1.items.addObject('Text', pointer(tal));
Så kan du jo trække dem ud igen med noget lig dette:
label1.Caption :=
IntToStr(Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]));
Det er ikke så "rent" som at bruge name/value, men det er
måske lidt nemmere.
--
Thomas Due
Software Developer
Scanvaegt Nordic A/S
| |
![](/images/tree/0.gif) Mark S. Rasmussen (22-08-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : Mark S. Rasmussen |
Dato : 22-08-02 16:23 |
|
> Det er ikke så "rent" som at bruge name/value, men det er
> måske lidt nemmere.
Hvad mener du med ikke så rent, er det performance du tænker på? Eller mener
du mere at som god kodeskik bør man bruge properties til det de er lavet
til? :)
Mvh Mark
--
www.improve.dk
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) David A. D. Konrad (22-08-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : David A. D. Konrad |
Dato : 22-08-02 16:58 |
|
"Mark S. Rasmussen" <mark@tv.dk> skrev i en meddelelse
news:ak2vl9$lau$1@news.cybercity.dk...
> > Det er ikke så "rent" som at bruge name/value, men det er
> > måske lidt nemmere.
>
> Hvad mener du med ikke så rent, er det performance du tænker på? Eller
mener
> du mere at som god kodeskik bør man bruge properties til det de er lavet
> til? :)
Det er noget forfærdeligt miskmask, dvs en potentiel fejlkilde, hvis det
eneste man har behov for er at knytte et ID til sine items.
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) ![](/images/tree/0.gif) Thomas Due (23-08-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : Thomas Due |
Dato : 23-08-02 07:14 |
|
"David A. D. Konrad" <david_konrad@hotmail.com> wrote in message
news:ak31lo$r2r$1@sunsite.dk...
> "Mark S. Rasmussen" <mark@tv.dk> skrev i en meddelelse
> news:ak2vl9$lau$1@news.cybercity.dk...
> > Hvad mener du med ikke så rent, er det performance du tænker på?
> > Eller mener du mere at som god kodeskik bør man bruge properties
> > til det de er lavet til? :)
>
> Det er noget forfærdeligt miskmask, dvs en potentiel fejlkilde, hvis det
> eneste man har behov for er at knytte et ID til sine items.
>
Ja, det er sådan cirka det jeg mener. Hvis man ellers har styr på sine
pointere, så kan det sagtens virke, men man skal altså være klar over
hvad man laver. Ellers kan det nemlig sagtens gå galt.
Men det er nemt. ;)
--
Thomas Due
Software Developer
Scanvaegt Nordic A/S
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) ![](/images/tree/0.gif) ![](/images/tree/0.gif) David A. D. Konrad (23-08-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : David A. D. Konrad |
Dato : 23-08-02 07:35 |
|
Thomas Due wrote:
> Ja, det er sådan cirka det jeg mener. Hvis man ellers har styr på sine
> pointere, så kan det sagtens virke, men man skal altså være klar over
> hvad man laver. Ellers kan det nemlig sagtens gå galt.
Det er ikke så meget det - set ud fra et udviklingssynspunkt
* skal der skrives mere
* er der flere potentielle fejlkilder
* er der mere ulæselig kode - eller "mindre læsværdig kode"
Altså overhovedet ikke smart, efter helt basale udviklingsmæssige
principper. Men sidder man derhjemme med sit eget projekt går det jo nok -
og det fylder jo i parantes bemærket langt mindre. Taler vi om en liste på
10.000 items, og der er en stribe af dem, er det en helt klar forbedring.
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) ![](/images/tree/0.gif) ![](/images/tree/0.gif) ![](/images/tree/0.gif) Lars Bargmann (23-08-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : Lars Bargmann |
Dato : 23-08-02 10:21 |
|
Der er såmænd også en klar ydelsesforbedring i at bruge pointer/integer
typecast'et.... men det kommer jo nok ikke til udtryk med mindre det er
MANGE records vi snakker om her, og med nutidens maskiner mærkes det vel
næppe, heller...
"David A. D. Konrad" <david_konrad@hotmail.com> wrote in message
news:ak4l2g$55f$1@sunsite.dk...
> Thomas Due wrote:
>
> > Ja, det er sådan cirka det jeg mener. Hvis man ellers har styr på sine
> > pointere, så kan det sagtens virke, men man skal altså være klar over
> > hvad man laver. Ellers kan det nemlig sagtens gå galt.
>
> Det er ikke så meget det - set ud fra et udviklingssynspunkt
>
> * skal der skrives mere
> * er der flere potentielle fejlkilder
> * er der mere ulæselig kode - eller "mindre læsværdig kode"
>
> Altså overhovedet ikke smart, efter helt basale udviklingsmæssige
> principper. Men sidder man derhjemme med sit eget projekt går det jo nok -
> og det fylder jo i parantes bemærket langt mindre. Taler vi om en liste på
> 10.000 items, og der er en stribe af dem, er det en helt klar forbedring.
>
>
>
| |
![](/images/tree/0.gif) Mark S. Rasmussen (23-08-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : Mark S. Rasmussen |
Dato : 23-08-02 23:35 |
|
> Alternativt kan man bruge Object propertien på hvert item.
> F.eks. Combox1.items.addObject('Text', pointer(tal));
>
> Så kan du jo trække dem ud igen med noget lig dette:
>
> label1.Caption :=
> IntToStr(Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]));
Hej igen. Jeg har nogle problemer med at få det til at virke. Jeg bruger
følgende kode til at tilføje rækkerne til boxen:
frmConnect.cmbServerGroups.Items.AddObject(rsData.Fields[1].Value,
Pointer(Integer(rsData.Fields[0].Value)));
Og følgende for at teste værdien:
ShowMessage(String(cmbServerGroups.Items.Objects[cmbServerGroups.ItemIndex])
)
Men den giver mig en "Access violation" fejl. Gør jeg noget forkert?
Mvh Mark
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) David A. D. Konrad (25-08-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : David A. D. Konrad |
Dato : 25-08-02 11:32 |
|
"Mark S. Rasmussen" <mark@tv.dk> skrev i en meddelelse
news:ak6dbq$1ckt$1@news.cybercity.dk...
> Hej igen. Jeg har nogle problemer med at få det til at virke. Jeg bruger
> følgende kode til at tilføje rækkerne til boxen:
> frmConnect.cmbServerGroups.Items.AddObject(rsData.Fields[1].Value,
> Pointer(Integer(rsData.Fields[0].Value)));
>
> Og følgende for at teste værdien:
>
ShowMessage(String(cmbServerGroups.Items.Objects[cmbServerGroups.ItemIndex])
> )
>
> Men den giver mig en "Access violation" fejl. Gør jeg noget forkert?
Se, det var jo lige præcis den slags problemer jeg henviste til! Hvorfor
bruger du ikke name og value? Det er det, som disse properties er der for.
Prøv med
ShowMessage(String(POINTER(cmbServerGroups.Items.Objects[cmbServerGroups.Ite
mIndex]))
| |
|
|