Announcement

Collapse
No announcement yet.

Speichern der Fensterpositionen von mehreren Forms in einer Struktur ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Speichern der Fensterpositionen von mehreren Forms in einer Struktur ?

    Hallo,

    die Positionen von verschiedenen Forms werden in einer Datenbank gespeichert. Beim einlesen der Werte, möchte ich diese in einer geeigneten
    Struktur zwischenspeichern. Dies ist notwendig, weil die Forms während
    der Laufzeit erst erzeugt werden.

    Ich bin mir nun nicht ganz sicher in welcher Struktur so etwas am sinn-
    vollsten zu speichern ist. Ich sollte später sehr einfach, wenn möglich
    über den Form Namen auf die Einträge zugreifen können.

    Danke für eure Tips.

    Stefan

  • #2
    Hallo,

    in diesem Fall würde ich die eigene Datenstrukturen direkt als Komponente in BLOb-Form in der Tabellenspalte speichern. Das hat den Vorteil, das jederzeit die Datenstruktur geändert werden kann, ohne das die Datenbankstruktur geändert werden muss. Und auch nach einer Strukturänderung sind die alten BLOb-Daten noch lesbar, auch dann, wenn in der Zwischenzeit neue Felder hinzugekommen sind.

    Das folgende Beispiel demonstriert diesen Fall, eine Grafikdatei soll zusammen mit der Beschreibung als Komponenteninstanz in einem BLOb-Feld der Datenbank gespeichert werden:
    <pre>
    TSaveRecord = class(TComponent)
    private
    procedure FileNameReadProc(Reader: TReader);
    procedure FileNameWriteProc(Writer: TWriter);
    procedure FileDataReadProc(Stream: TStream);
    procedure FileDataWriteProc(Stream: TStream);
    procedure FileSizeReadProc(Reader: TReader);
    procedure FileSizeWriteProc(Writer: TWriter);
    public
    FFileName: String;
    FFileData: TMemoryStream;
    FFileSize: Integer;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure DefineProperties(Filer: TFiler); override;
    end;
    </pre>
    Nachdem die Komponenteneigenschaften über die <b>TFiler</b>-Methoden definiert wurden, kann diese Instanz über <b>WriteComponent</b> in das Blob-Feld geschrieben werden:
    <pre>
    procedure TForm1.InsertBMP(sFileName, sBMPName: String);
    var
    SR : TSaveRecord;
    FS : TFileStream;
    BS : TStream;
    begin
    IBDataSet1.Insert;
    IBDataSet1NAME.Value := sBMPName;
    SR := TSaveRecord.Create(nil);
    try
    SR.FFileName := sBMPName;
    FS := TFileStream.Create(sFileName, fmOpenRead);
    try
    SR.FFileData.CopyFrom(FS, FS.Size);
    SR.FFileSize := FS.Size;
    finally
    FS.Destroy;
    end;
    BS := IBDataSet1.CreateBlobStream(IBDataSet1DATA, bmWrite);
    try
    BS.WriteComponent(SR); // BS = Daten im DFM-Format
    IBDataSet1.Post;
    finally
    BS.Destroy;
    end;
    finally
    SR.Destroy;
    end;
    IBTransaction1.Commit;
    IBDataSet1.Open;
    end;
    </pre>
    Beim Auslesen kann man dann auf die Objektfelder der Komponente direkt zugreifen:
    <pre>
    ...
    SR := BS.ReadComponent(nil) as TSaveRecord;
    try
    StaticTextExportName.Caption := SR.FFileName;
    StaticTextStreamSize.Caption := Format('%d Bytes', [SR.FFileData.Size]);
    StaticTextExportSize.Caption := Format('%d Bytes', [SR.FFilesize]);
    SR.FFileData.SaveToFile(cEXPORT_BMP);
    finally
    SR.Free;
    end;
    Image1.Picture.Bitmap.LoadFromFile(cEXPORT_BMP);
    ...
    </pre&gt

    Comment

    Working...
    X