derzeit bastel ich an einer Datenbankanwendung (SQLite3), in der die einzelnen Records aus der Datenbank auf je einer Seite (TPage) in einem Notebook (TNotebook) darstellen soll. Dazu wollte ich mir eine eigene Klasse von TPage ableiten, die selbstständig (in ihrem constructor) die benötigten Controls also Labels, Editfelder, usw. erstellt.
Die ganze Datenbankanbindung funktioniert soweit und auch die einzelnen Seiten werden erstellt. Jedoch werden die Controls, die dort drauf sein sollten, nicht oder nur teilweise angezeigt.
Mit folgendem Code wird die Seite erstellt und dem Notebook (NbMain) hinzugefügt.
ARecord ist ein ein Pointer auf einen Record, der eine Zeile aus der Datenbank enthält (Pointer deshalb, weil ich nicht immer einen ganzen Record verschieben will; auch wenn es nur 20 Byte sind).
Code: Alles auswählen
var page: TApplicationPage;
begin
page := TApplicationPage.Create(self,ARecord);
page.Caption := ARecord^.ApplicationName;
page.Parent := NbMain;
NbMain.PageList.Add(TPage(page));
end;
Code: Alles auswählen
interface
type
// zuerst der Record aus der Datenbank
PDBApplicationRecord = ^TDBApplicationRecord;
TDBApplicationRecord = record
ID: LongInt;
ApplicationName: String;
UserName: String;
RegistrationKey: String;
Comment: String;
end;
// dann die seite selbst
TRecordChange = procedure(Sender: TObject; NewRecord: PDBApplicationRecord) of object; // ein event handler
TApplicationPage = class(TPage)
private
fRecord: PDBApplicationRecord;
fRecordChange: TRecordChange;
function GetRecord: TDBApplicationRecord;
procedure SetRecordP ( const AValue: PDBApplicationRecord ) ;
protected
procedure RecordChanged;
public
LabelId: TLabel;
EditId: TEdit;
constructor Create(TheOwner: TComponent); override; overload;
constructor Create(TheOwner: TComponent; PRecord: PDBApplicationRecord); overload;
function GetId: LongInt; // gibt die Datenbank-id des Records zurück
property ApplicationRecordP: PDBApplicationRecord read fRecord write SetRecordP;
property ApplicationRecord: TDBApplicationRecord read GetRecord;
property OnRecordChange: TRecordChange read fRecordChange write fRecordChange;
end;
// alles, was deklariert aber noch nicht implementiert ist, habe ich mal raus genommen, wird sowieso nicht aufgerufen/benutzt
implementation
// Implementation; hier ist auch nur das drinnen, was zu der Klasse gehört und auch aufgerufen/benutzt wird
function TApplicationPage.GetRecord: TDBApplicationRecord;
begin
result := fRecord^;
end;
procedure TApplicationPage.SetRecordP ( const AValue: PDBApplicationRecord ) ;
begin
ShowMessage('Tab SetRecordP: ID_alt - '+IntToStr(fRecord^.ID));
if fRecord = AValue then exit;
fRecord := AValue;
RecordChanged;
ShowMessage('Tab SetRecordP: ID - '+IntToStr(fRecord^.ID));
EditId.Caption := IntToStr(fRecord^.ID);
end;
procedure TApplicationPage.RecordChanged;
begin
if Assigned(fRecordChange) then
fRecordChange(self, fRecord);
end;
constructor TApplicationPage.Create ( TheOwner: TComponent ) ;
begin
inherited Create ( TheOwner ) ;
fRecord := PEmptyAppRecord; // PEmptyAppRecord ist ein leerer Record (eine konstante)
{ ab hier werden dann die anderen steuerelemente erstellt }
{ also ein label }
LabelId := TLabel.Create(self);
with LabelId do begin
Caption := 'ID:';
SetBounds(20,20,Width,Height);
Parent := self;
end;
{ und ein edit-feld }
EditId := TEdit.Create(self);
with EditId do begin
EditId.Caption := '';
SetBounds(80,20,Width,Height);
Enabled := false;
Parent := self;
end;
end;
constructor TApplicationPage.Create ( TheOwner: TComponent;
PRecord: PDBApplicationRecord ) ;
begin
Create(TheOwner);
SetRecordP(PRecord);
end;
function TApplicationPage.GetId: LongInt;
begin
result := fRecord^.ID;
end;
1. Die erste Seite wird erstellt, ist aber leer
2. Die zweite Seite wird auch erstellt, bei einem Klick auf den entsprechenden Eintrag im Notebook wird sie angezeigt, enthält aber nur ein Editfeld (mit falscher ID)
3. Bei einem Wechsel zurück zur ersten Seite sind hier jetzt Label und Edit-Feld vorhanden
4. Wird eine Weitere Seite erstellt, wird die aktuelle Seite leer (sie wird jedoch bei einem hin und her wechseln wieder gefüllt)
Die Reihenfolge, in der die einzelnen Seiten erstellt werden, scheint keine Rolle zu spielen (jedoch habe ich noch keine ausführliche Testreihe gemacht, da dies keine Rolle spielen sollte).
Vielleicht weiß jemand von euch, was ich falsch mache...
Mfg die Socke