Autor Beitrag
jackie05
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: Do 08.01.09 23:16 
Hallo,
ich habe hier im Forum nix passendes gefunden, was mein problem beheben könnte.

Gibt es vieleicht eine ComboBox indem ich URLs in Data ablegen kann, so wie bei der TListView?

Ich bedanke mich schonmal im Voraus.

MfG


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 08.01.2009 um 23:18
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 08.01.09 23:24 
Du kannst zu jedem Eintrag mit AddObject statt Add ein Objekt mit weiteren Informationen mit hinzufügen.
jackie05 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: Do 08.01.09 23:53 
Vielen Dank.

Ich hab das mal so gemacht:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
type
  TDownloadURL = record
  Titel: string;
  URL: string;
end;

type  
  pExItemData = ^TExtItemData;  
  TExtItemData = record   
    Titel: string;
    URL: string;
  end; 


var
  Form1: TForm1;
  Download: TDownloadURL;
  pData: pExItemData;

implementation

{$R *.dfm}

procedure TForm1.Button3Click(Sender: TObject);
begin 
  New(pData);
  With pData^ do begin
    Titel := Download.Titel;
    URL := Download.URL;
  end;
  ComboBox1.Items.AddObject(Download.Titel,TObject(pData));
  Dispose(pData);
end;


Das funktioniert soweit, neue Einträge hinzuzufügen, aber wenn ich es wieder auslesen möchte:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  if ComboBox1.ItemIndex > -1 then begin
    if ComboBox1.Items.Objects[ComboBox1.ItemIndex] <> Nil then begin
      pData := pExItemData(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);  
      With pData^ do begin
        Label1.Caption := URL;
      end;
    end;
  end;
end;

dann erhalte ich folgende fehlermeldung:
ausblenden Delphi-Quelltext
1:
Zugriffsverletzung bei Adresse 40006CFE in Modul 'rtl70.bpl'. Lesen von Adresse 00000008.					


Habe ich vieleicht etwas vergessen?

Edit: Ich habe den fehler gefunden, das Problem lag daran, das ich nach Button1 Klick, pData wieder freigegeben habe und deshalb bekam ich dann die Zugriffsverletzung.

Edit: Noch ein Problem habe ich, wenn ich mehrere Links hinzufüge, dann haben alle Einträge das zuletzt hinzugefügte URL, woran könnte das liegen?

MfG


Zuletzt bearbeitet von jackie05 am Fr 09.01.09 00:17, insgesamt 1-mal bearbeitet
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 09.01.09 00:13 
Ichhabe mir deinen Code jetzt nicht so genau angeguckt und nach dem fehler gesucht. Aber vergleich doch mal mit meinem Beispiel: www.michael-puff.de/...s/LB_AddObject.shtml
jackie05 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: Fr 09.01.09 00:31 
Vielen Dank, das hat mir echt weitergeholfen.

Nun funktioniert es.

MfG
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 09.01.09 00:36 
Wenn du ohnehin ein nicht TObject, nämlich einen Record, per Cast da hineinpresst, dann kannst du auch gleich einen String nehmen :mrgreen::
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var
  Url: String;
begin
  Url := 'http://www.google.de';
  ComboBox1.Items.AddObject('Google', TObject(Url));
  Url := 'http://www.yahoo.de';
  ComboBox1.Items.AddObject('Yahoo', TObject(Url));
end;

// Auslesen:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  // Die Abfrage ob der ItemIndex >= 0 ist kann man sich sparen,
  // wenn Style auf csDropDownList gesetzt wird. Dann kann man
  // nix selbst reinschreiben.
  ShowMessage(String(ComboBox1.Items.Objects[ComboBox1.ItemIndex]));
end;
Schöner fände ich eine richtige Klasse zu benutzen, dann ist es nämlich ein Nachfahre von TObject, der in ein TObject reingelegt wird. ;-)

// EDIT:
Ich überlege gerade wie dabei der Speicher richtig freigegeben wird und wo eigentlich die Stringvariablen im Speicher liegen. Vielleicht ist das doch keine so gute Idee. :oops:
Biergeneral
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35

WIN XP
Delphi 7 Ent., Delphi 2007 Ent., C/C++ (Eclipse)
BeitragVerfasst: Di 13.01.09 21:25 
Der Fehler im Quelltext lag übrigens hier:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button3Click(Sender: TObject); 
begin  
  New(pData); 
  With pData^ do begin 
    Titel := Download.Titel; 
    URL := Download.URL; 
  end; 
  ComboBox1.Items.AddObject(Download.Titel,TObject(pData)); 
  // -> Dispose(pData); 
end;


Wenn du den Speicher da schon wieder freigibst, kannst du später natürlich auch nichtmehr drauf zugreifen ;-)

Zitat:

Ich überlege gerade wie dabei der Speicher richtig freigegeben wird und wo eigentlich die Stringvariablen im Speicher liegen. Vielleicht ist das doch keine so gute Idee.



Der String würde, so wie auch jeder andere String per Referenzzählung wieder freigegeben werden, sobald der Pointer der Combobox nichtmehr darauf zeigt. Z.B. durch ein Combobox.Clear;