![]() |
Funktion / Stream in Richmemo laden ( Lazarus )
Hallo zusammen
vor einiger Zeit habe ich damit begonnen meine Delphianwendung nach Lazarus zu migrieren. Da ich in Lazarus keine Richtext-Memokomponente mit DB anbindung gefunden habe verwende ich richmemo ![]() Ich verwende gerade diese Funktion ( die noch unschön ist ).
Delphi-Quellcode:
Der Aufruf erfolgt so:
procedure TDM.rtf_stream_load(aTable: TDAMemDataTable; aField: String);
var rtfString : String; begin //Get the data from the database as AnsiString rtfString := aTable.FieldByName(aField).AsAnsiString; //Write the string into a stream stream := TMemoryStream.Create; stream.Clear; stream.Write(PAnsiChar(rtfString)^, Length(rtfString)); stream.Position := 0; //aForm.aElement.LoadRichText(stream); //stream.Free; end;
Delphi-Quellcode:
Frage:
procedure TDM_testimony.rtf_stream_read(Sender: TObject);
begin DM.rtf_stream_load(tbl_testimony,'TESTIMONY'); frm_testimony.RichMemo1.LoadRichText(stream); stream.Free; end; Wie kann ich der Funktion auch noch das zu verwendende Form übergeben? Danke für Eure Tipps.:P |
AW: Funktion / Stream in Richmemo laden ( Lazarus )
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:
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:
// ----- Ü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;
Delphi-Quellcode:
Den Stream kannst du dann jeweils mit LoadFromStream bzw. SaveToStream ins Memo einlesen bzw. aus dem Memo extrahieren.
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; 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. |
AW: Funktion / Stream in Richmemo laden ( Lazarus )
Einfach einen weiteren Parameter hinzufügen.
|
AW: Funktion / Stream in Richmemo laden ( Lazarus )
Danke für die Tipps.
Werde es gleich bei mir testen. :thumb: |
AW: Funktion / Stream in Richmemo laden ( Lazarus )
Versuche nur meine Ursprüngliche Idee zum laufen zu bringen...
Irgendwie fehlt mir da das Grundverständniss.....
Delphi-Quellcode:
Ich erhalte hier:
procedure TDM.rtf_stream_load(aTable: TDAMemDataTable; aField: String; aForm: TForm; aComponent: TObject);
var rtfString : String; begin //Get the data from the database as AnsiString rtfString := aTable.FieldByName(aField).AsAnsiString; //Write the string into a stream stream := TMemoryStream.Create; stream.Clear; stream.Write(PAnsiChar(rtfString)^, Length(rtfString)); stream.Position := 0; aForm.aComponent.LoadRichText(stream); // stream.Free; end;
Code:
Sorry wenn ich da nochmals nachfrage:oops:
udm.pas(229,12) Error: identifier idents no member "aComponent"
|
AW: Funktion / Stream in Richmemo laden ( Lazarus )
Die Angabe der Form ist auch nicht nötig. Dafür aber ein cast auf die richtige Kllase bzw. gleich die richtige Vorgabe auf eine Komponenetnklasse, welche die Methode unterstützt.
|
AW: Funktion / Stream in Richmemo laden ( Lazarus )
Danke schon mal...
Hab's ein wenig angepasst.. Bin mir nur nicht sicher wie ich das mit der Form mache....
Delphi-Quellcode:
Der Aufruf:
procedure TDM.rtf_stream_load(aTable: TDAMemDataTable; aField: String; ARichMemo: TCustomRichMemo);
var rtfString : String; begin //Get the data from the database as AnsiString rtfString := aTable.FieldByName(aField).AsAnsiString; //Write the string into a stream stream := TMemoryStream.Create; stream.Clear; stream.Write(PAnsiChar(rtfString)^, Length(rtfString)); stream.Position := 0; ARichMemo.LoadRichText(stream); // stream.Free; end;
Delphi-Quellcode:
Ich erhalte den Fehler:
procedure TDM_testimony.rtf_stream_read(Sender: TObject);
begin DM.rtf_stream_load(tbl_testimony,'TESTIMONY',RichMemo1); end;
Code:
Ich hab Ihm ja auch nicht gesagt wo die Richmemo liegt... :?
udm_testimony.pas(137,64) Error: Identifier not found "RichMemo1"
|
AW: Funktion / Stream in Richmemo laden ( Lazarus )
Habs...:P
Der Aufruf war falsch...
Delphi-Quellcode:
Besten Dank für Eure Hilfe:thumb:
procedure TDM_testimony.rtf_stream_read(Sender: TObject);
begin DM.rtf_stream_load(tbl_testimony,'TESTIMONY',frm_testimony.RichMemo1); end; |
AW: Funktion / Stream in Richmemo laden ( Lazarus )
Wieso übergibst Du eigentlich Tabellen- und Feldnamen statt gleich das Feld, das eigentlich gemeint ist?
|
AW: Funktion / Stream in Richmemo laden ( Lazarus )
Guten Morgen
Code:
DM.rtf_stream_load(tbl_testimony,'TESTIMONY',frm_t estimony.RichMemo1);
Wieso übergibst Du eigentlich Tabellen- und Feldnamen statt gleich das Feld, das eigentlich gemeint ist?
tbl_testimony: TDAMemDataTable TESTIMONY: Feldname frm_testimony: Formname RichMemo1: Name der Komponente Was darf dann hier fehlen? |
AW: Funktion / Stream in Richmemo laden ( Lazarus )
Man könnte auch direkt die TField-Instanz übergeben:
Delphi-Quellcode:
procedure TDM.rtf_stream_load( aField: TField; ARichMemo: TCustomRichMemo);
Delphi-Quellcode:
DM.rtf_stream_load(tbl_testimony.FieldByName('TESTIMONY'),frm_testimony.RichMemo1);
|
AW: Funktion / Stream in Richmemo laden ( Lazarus )
Hört sich gut an.
Danke für den Tipp. Shalom Manfred |
AW: Funktion / Stream in Richmemo laden ( Lazarus )
Noch eine Frage
Habe eben diesen Post gefunden: ![]() Bietet TReader, TWriter vorteile gegenüber meiner gefundenn Lösung?
Delphi-Quellcode:
procedure TForm1.ButtonLadenClick(Sender: TObject);
Var Stream:TFilestream; begin Stream:=TFileStream.Create('D:\TestStream',fmOpenRead or fmShareDenyNone); try //TReader objekt erstellen und Daten aus den Stream laden with TReader.create(Stream,1024) do try Memo1.Text := ReadString; Edit1.Text := ReadString; SpinEdit1.Value := ReadInteger; CheckBox1.Checked := ReadBoolean; finally free; end; finally Stream.free; end; end;
Delphi-Quellcode:
procedure TForm1.ButtonSpeichernClick(Sender: TObject);
Var Stream:TFilestream; begin Stream:=TFileStream.Create('D:\TestStream',fmcreate); try //TWriter objekt erstellen und Daten in den Stream speichern with TWriter.create(Stream,1024) do try WriteString(Memo1.Text); WriteString(Edit1.Text); WriteInteger(SpinEdit1.Value); WriteBoolean(CheckBox1.Checked); finally free; end; finally Stream.free; end; end; |
AW: Funktion / Stream in Richmemo laden ( Lazarus )
Manfred, wieso probierst du nicht einfach die Universal-Lösung, die ich
![]()
Delphi-Quellcode:
Wenn du das Feld angibst, mußt du weder Tabellenname noch sonstwas übergeben, denn das Feld führt ja ein Property mit, welches das Dataset beinhaltet: Feld.Dataset. Du mußt also nicht mit der Kirche ums ganze Dorf fahren :)
Procedure TForm1.AufrufendeMethode(Sender : TObject);
Var Feld : TField; S : TMemoryStream; begin S := TMemoryStream.Create; Try Feld := DatenModul.MyQuery.FieldByName('MeinBlobFeld'); // oder wie auch immer deine Tabellenkomponente und dein Blobfeld benannt sind Memo.Lines.SaveToStream(S); If Not DatenModul.StreamToBlob(S,Feld) Then ShowMessage('Fehler'); // oder eben ein globaler Fehlerstring, wie ich ihn verwende Finally S.Free; End; end; Ungetestet, da nur schnell als Beispiel reingetippt ... |
AW: Funktion / Stream in Richmemo laden ( Lazarus )
Hallo Perlsau
Hab Deinen Vorschlag nicht vergessen und auch schon ausprobiert. "Meine" urspründliche Lösung war für mich nur verständlicher. Aber ich versuche auch gerne die von Dir nochmals angepasste Version. Danke Nochmals für Deinen Tipp. :thumb: Zitat:
Shalom Manfred |
AW: Funktion / Stream in Richmemo laden ( Lazarus )
Ich weiß ja nicht, ob das unter Lazarus auch geht, aber ein ganz simples
Delphi-Quellcode:
macht das unter Delphi genauso (ist nur kürzer in der Schreibweise).
RichMemo1.Lines.Assign( DBField1 );
Und zurück geht das mit
Delphi-Quellcode:
.
DBField1.Assign(RichMemo1.Lines);
|
AW: Funktion / Stream in Richmemo laden ( Lazarus )
Delphi-Quellcode:
Sieht ja super kurz aus. :-D
RichMemo1.Lines.Assign( DBField1 )
Erhalte aber den Fehler : Cannot assign a TDAField to a TWin32RichMemoString. Muss das Morgen mal anschauen. |
AW: Funktion / Stream in Richmemo laden ( Lazarus )
Funktioniert es mit RichMemo1.Lines.Assign( DBField1.asString ) ?
|
AW: Funktion / Stream in Richmemo laden ( Lazarus )
Voraussetzung dafür ist natürlich das Lines ein Nachfahr von
Delphi-Quellcode:
ist und das Feld ein
TStrings
Delphi-Quellcode:
.
TBlobField
So geht es auf jeden Fall mit Delphi, dort findet man das in den Sourcen bei
Delphi-Quellcode:
und
TBlobField.Assign
Delphi-Quellcode:
.
TBlobField.AssignTo
|
AW: Funktion / Stream in Richmemo laden ( Lazarus )
Habe es getestet:
Delphi-Quellcode:
Erhalte aber leider die Fehlermeldung:
frm_testimony.RM_Testimony.Lines.Assign( tbl_testimony.FieldByName('TESTIMONY').AsString)
Error: Incompatible type for arg no. 1: Got "WideString", expected "TPersistent" |
AW: Funktion / Stream in Richmemo laden ( Lazarus )
Zitat:
Dokumentation zu ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz