Registriert seit: 1. Nov 2007
Ort: Marburg Lahn
235 Beiträge
Delphi 2007 Professional
|
Re: Problem mit Combobox.Items.AddObject()
27. Mai 2008, 10:15
Hallo nochmal,
also Ich komme wirklich nicht weiter. Ich habe die klasse aus dem Link von Brainshock ausprobiert und es kamen einige Fehler vor die Ich nicht nachvollziehen konnte.
Ich habe mir nochmal ein Programmierbeispiel angeschaut und bin jetzt soweit:
Die Ausgabe per ShowMessage erfolgt beim Select event der ComboBox.
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, VisiComboBox, Unit3, l_TreiberInit, DB, vddDataSet,
vddReferenceDataSet, vddCustomQuery, vddQuery, vddDataSource;
type
TForm1 = class(TForm)
VisiComboBox1: TVisiComboBox;
VddQuery1: TVddQuery;
procedure FormCreate(Sender: TObject);
procedure VisiComboBox1Select(Sender: TObject);
private
var Spalten : TStringList;
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Treibermodule.LoginDialog.Execute;
Spalten := TStringList.Create;
Spalten.Add(' AdrNr');
Spalten.Add(' AngelegtAm');
ComboBox_fuellen(VisiComboBox1, VddQuery1, Spalten, ' adress');
end;
procedure TForm1.VisiComboBox1Select(Sender: TObject);
begin
PoolData := TPoolData(VisiCombobox1.Items.Objects[VisiCombobox1.ItemIndex]);
showmessage(PoolData.var1);
end;
end.
Hier die zweite Unit mit der procedure und einer Klasse ähnlich wie Sie in dem Link beschrieben ist:
Delphi-Quellcode:
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, vddDataSource, vddDataSet, vddReferenceDataSet,
vddIndexedDataSet, vddCustomTable, vddTable, Grids, DBGrids, VisiDbGrid,
StdCtrls, ExtCtrls, ComCtrls, VisiStatusBar, vddCustomQuery, vddQuery, Math,
Menus, VisiListBox, VisiDbListBox, VisiComponent, VisiDbLookupControl,
VisiDbLookupListBox, DBCtrls, VisiComboBox;
procedure ComboBox_fuellen(ComboBox : TVisiComboBox; VddQuery : TVddQuery;
Spalten : TStringlist; Tabelle : String);
type
TPoolData = class(TObject)
var1: String;
var2: string;
end;
var PoolData : TPoolData;
implementation
procedure ComboBox_fuellen(ComboBox : TVisiComboBox; VddQuery : TVddQuery;
Spalten : TStringlist; Tabelle : String);
var i : Integer;
begin
PoolData := TPoolData.Create;
VddQuery.SQL.Clear;
VddQuery.SQL.Add(' Select ');
for i := 0 to Spalten.Count -1 do
begin
VddQuery.SQL.Add(Spalten.Strings[i]+ ' , ');
end;
VddQuery.SQL.Add(' From ' + Tabelle);
VddQuery.SQL.Add(' Order By ' +Spalten[0]);
VddQuery.Open;
VddQuery.First;
While not VddQuery.EoF do
begin
PoolData.var1 := VddQuery.FieldByName(Spalten[1]).asString;
PoolData.var2 := VddQuery.Fieldbyname(Spalten[0]).asString;
Combobox.Items.AddObject(VddQuery.FieldByName(Spalten[0]).asString, PoolData);
VddQuery.Next;
end;
end;
end.
Das Problem ist jetzt, dass wenn Ich ein Item in der ComboBox auswähle mir immer nur der Feldeintrage der letzten Zeile in der Tabelle angezeigt wird, was ja auch eigentlich wegen der Schleife in der procedure klar ist.
Delphi-Quellcode:
While not VddQuery.EoF do
begin
PoolData.var1 := VddQuery.FieldByName(Spalten[1]).asString;
PoolData.var2 := VddQuery.Fieldbyname(Spalten[0]).asString;
Combobox.Items.AddObject(VddQuery.FieldByName(Spalten[0]).asString, PoolData);
VddQuery.Next;
end;
Aber in dem Programmierbeispiel wurde es genauso gemacht(glaube Ich zumindest oO ). Zumindest bekomme Ich schon nicht mehr die AccessViolation
Hier das Programmierbeispiel von dem ich die ganze Zeit rede:
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, VisiComboBox, DB, vddDataSet, vddReferenceDataSet,
vddCustomQuery, vddQuery, vddDataSource;
type
TPoolData = class(TObject)
ID: integer;
Bezeichnung: string;
end;
type
TForm1 = class(TForm)
VddDataSource1: TVddDataSource;
VddQuery1: TVddQuery;
VisiComboBox1: TVisiComboBox;
ComboBox1: TComboBox;
procedure FormCreate(Sender: TObject);
procedure VisiComboBox1Select(Sender: TObject);
private
{ Private-Deklarationen }
PoolData : TPoolData;
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
uses l_TreiberInit;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var id, Bez : String;
i : Integer;
begin
Treibermodule.LoginDialog.Execute;
VddQuery1.SQL.Clear;
VddQuery1.SQL.Add(' Select * From ADRPOOL');
VddQuery1.Open;
VddQuery1.First;
for I := 0 to VddQuery1.RecordCount - 1 do
begin
ID := VddQuery1.FieldByName(' ID').asString;
Bez := VddQuery1.FieldByName(' Bezeichnung').asString;
PoolData := TPoolData.Create;
PoolData.ID := VddQuery1.FieldByName(' ID').asinteger;
PoolData.Bezeichnung := VddQuery1.Fieldbyname(' Bezeichnung').asstring;
VisiCombobox1.Items.AddObject(Bez + ' ' + ID, PoolData);
VddQuery1.Next;
end;
end;
procedure TForm1.VisiComboBox1Select(Sender: TObject);
begin
PoolData := TPoolData(VisiCombobox1.Items.Objects[VisiCombobox1.ItemIndex]);
showmessage(IntToStr(PoolData.ID));
end;
end.
Ich hoffe es war nicht zuviel aber Ich komme einfach nicht weiter
mfg
Bossi
|