AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Funktion / Stream in Richmemo laden ( Lazarus )
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion / Stream in Richmemo laden ( Lazarus )

Ein Thema von manfred_h · begonnen am 15. Sep 2015 · letzter Beitrag vom 17. Sep 2015
Antwort Antwort
Seite 1 von 3  1 23      
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#1

Funktion / Stream in Richmemo laden ( Lazarus )

  Alt 15. Sep 2015, 14:18
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 http://wiki.lazarus.freepascal.org/RichMemo

Ich verwende gerade diese Funktion ( die noch unschön ist ).

Delphi-Quellcode:
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;
Der Aufruf erfolgt so:
Delphi-Quellcode:
procedure TDM_testimony.rtf_stream_read(Sender: TObject);
begin
     DM.rtf_stream_load(tbl_testimony,'TESTIMONY');
     frm_testimony.RichMemo1.LoadRichText(stream);

     stream.Free;
end;
Frage:
Wie kann ich der Funktion auch noch das zu verwendende Form übergeben?

Danke für Eure Tipps.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#2

AW: Funktion / Stream in Richmemo laden ( Lazarus )

  Alt 15. Sep 2015, 14:30
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.

Geändert von Perlsau (15. Sep 2015 um 21:54 Uhr) Grund: Nachtrag
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Funktion / Stream in Richmemo laden ( Lazarus )

  Alt 15. Sep 2015, 14:42
Einfach einen weiteren Parameter hinzufügen.
Markus Kinzler
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#4

AW: Funktion / Stream in Richmemo laden ( Lazarus )

  Alt 15. Sep 2015, 14:48
Danke für die Tipps.
Werde es gleich bei mir testen.
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#5

AW: Funktion / Stream in Richmemo laden ( Lazarus )

  Alt 15. Sep 2015, 17:43
Versuche nur meine Ursprüngliche Idee zum laufen zu bringen...
Irgendwie fehlt mir da das Grundverständniss.....

Delphi-Quellcode:
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;
Ich erhalte hier:
Code:
udm.pas(229,12) Error: identifier idents no member "aComponent"
Sorry wenn ich da nochmals nachfrage
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Funktion / Stream in Richmemo laden ( Lazarus )

  Alt 15. Sep 2015, 17:47
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.
Markus Kinzler
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#7

AW: Funktion / Stream in Richmemo laden ( Lazarus )

  Alt 15. Sep 2015, 18:15
Danke schon mal...
Hab's ein wenig angepasst.. Bin mir nur nicht sicher wie ich das mit der Form mache....

Delphi-Quellcode:
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;
Der Aufruf:
Delphi-Quellcode:
procedure TDM_testimony.rtf_stream_read(Sender: TObject);
begin
    DM.rtf_stream_load(tbl_testimony,'TESTIMONY',RichMemo1);
end;
Ich erhalte den Fehler:
Code:
udm_testimony.pas(137,64) Error: Identifier not found "RichMemo1"
Ich hab Ihm ja auch nicht gesagt wo die Richmemo liegt...
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#8

AW: Funktion / Stream in Richmemo laden ( Lazarus )

  Alt 15. Sep 2015, 18:17
Habs...

Der Aufruf war falsch...
Delphi-Quellcode:
procedure TDM_testimony.rtf_stream_read(Sender: TObject);
begin
    DM.rtf_stream_load(tbl_testimony,'TESTIMONY',frm_testimony.RichMemo1);
end;
Besten Dank für Eure Hilfe
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#9

AW: Funktion / Stream in Richmemo laden ( Lazarus )

  Alt 15. Sep 2015, 18:56
Wieso übergibst Du eigentlich Tabellen- und Feldnamen statt gleich das Feld, das eigentlich gemeint ist?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#10

AW: Funktion / Stream in Richmemo laden ( Lazarus )

  Alt 16. Sep 2015, 09:05
Guten Morgen
Code:
Wieso übergibst Du eigentlich Tabellen- und Feldnamen statt gleich das Feld, das eigentlich gemeint ist?
DM.rtf_stream_load(tbl_testimony,'TESTIMONY',frm_t estimony.RichMemo1);

tbl_testimony: TDAMemDataTable
TESTIMONY: Feldname
frm_testimony: Formname
RichMemo1: Name der Komponente

Was darf dann hier fehlen?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz