Wozu mußt du TForm übergeben? Du machst dir im Datemodul eine Funktion, die den Tabellennamen, den Datensatz-Identifier (Primary-Key) und den Stream entgegennimmt, den Stream dann befüllt und bei Erfolg True zurückgibt. Zum Speichern des Memo-Inhalts machst du dir eine Kopie dieser Funktion und baust sie derart um, daß der Stream in der Datenbank gespeichert wird:
Delphi-Quellcode:
// ----- Übergibt den Inhalt eines Blobfelds an Stream
Function TDatMod.BlobToStream(Stream: TMemoryStream; Feld: TField): Boolean;
Var
S : TStream;
begin
Result := False;
If Not Feld.IsBlob Then Exit;
If Feld.IsNull Then Exit;
S := Nil;
Try
S := Feld.DataSet.CreateBlobStream(Feld, bmRead);
Stream.Clear;
Stream.CopyFrom(S,S.Size);
Result := True;
Finally
S.Free;
End;
end;
// ----- Übergibt den Inhalt eines Streams
Function TDatMod.StreamToBlob(Stream: TMemoryStream; Feld: TField): Boolean;
Var
S : TStream;
begin
Result := False;
If Not Feld.IsBlob Then Exit;
S := Nil;
Try
S := Feld.DataSet.CreateBlobStream(Feld, bmReadWrite);
S.CopyFrom(Stream,Stream.Size);
Result := True;
Finally
S.Free;
End;
end;
Bei mir fehlt die Lokalisierung des Datensatzes, weil ich in meinen Anwendungen bereits in jeweiligen Datensatz bin. Auch die Übergabe des Tabellennamens erübrigt sich, wenn man das Feld vom Typ TField übergibt:
Delphi-Quellcode:
Procedure MemoAktualisieren;
Var
Feld : TField;
S : TMemoryStream;
begin
Feld := DatenModul.MyQuery.FieldByName('BEMERKUNGEN');
S := TMemoryStream.Create;
Try
Memo.Lines.SaveToStream(S);
If Not DatenModul.BlobToStream(S,Feld) Then
ShowMessage('Fehler');
Finally;
S.Free;
End;
end;
Den Stream kannst du dann jeweils mit
LoadFromStream bzw.
SaveToStream ins Memo einlesen bzw. aus dem Memo extrahieren.
Nachtrag: Dein geposteter Quelltest enthält keine
Functions, sondern lediglich zwei
Procedures. Will man beide, Function und Procedure, die zu einer Klasse gehören, umschreiben, spricht man von Methoden.
Alles ungetestet.