21. juli 2006 - 23:26Der er
6 kommentarer og 1 løsning
RichEdit og DB.
Hvordan gemmer man indhold af RichEdit i en DB? Jeg ved hvordan man forbinder til DB med ADO. Men kender ikke syntax for gemme indhold. Når man gemmer, gemmer den automatisk fontstyle og andet, så som, tekst der er FED, kursiv og forskellig symboler?
Jeg har rodet lidt med den men syntes ikke lige jeg kan finde et sted hvor man kan hive alle oplysninger ud samlet (men det findes sikkert). En lidt fusket løsning kunne være at kører via en fil, dvs. gemme i en temp fil og derefter læse denne fil ind i f.eks. en TStringList hvor du så kan finde alt teksten i StringList.Text;
Men det skulle da være mærkelig hvis der ikke findes en bedre måde, en eller anden må da vide det.
Lines.SaveToFile og Lines.LoadFromFile gemmer data i RTF-format - så det er ligeud af landevejen for det samme gør SaveToStream og LoadFromStream. Det er bare et spørgsmål om at lave en TBlobStream til feltet i tabellen i databasen og så streame indholdet af TRichEdit'en frem og tilbage.
I øvrigt: Når jeg tænker på at læse og skrive til tabeller så tænker jeg altid SQL-vegne og data via en TAdoQuery.ParamByName (property hedder vist noget andet i ADO).
Hvis du skal have hjælp til det kan jeg godt arbejde lidt på et eksempel - men giv mig tid. Jeg har ferie fra arbejdet, men ikke fra familien...
Jeg oprettede en access-database med en tabel indeholdende et autoinc. ID som også er primærnøglen (ikke at det er vigtigt, men det er bare for god ordens skyld). Dernæst et felt jeg kaldre reData af typen Memo (max grænse 64kb) som er det nærmeste Access kommer et blob-felt (medmindre ole-typen kan bruges). Den forbinder jeg til i mit testprogram og det lykkes mig at gemme og hente data fra tabellen.
Det der tog et stykke tid var, at jeg gemte som streng, men hentede igen som widestring (dvs. hhv. 8 og 16bit pr. tegn). Det kunne TRichEdits LoadFromStream ikke li'. Løsningen var at vælge ftFmtMemo. Så faldt det hele på plads.
procedure TfrmMain.btnLoadClick(Sender: TObject); var MemoryStream : TMemoryStream; begin ADOConnection.Open; try ADOQuery.SQL.Text := 'select reData from data where id=(select max(id) from data)'; ADOQuery.Open; try if not ADOQuery.Eof then begin MemoryStream := (ADOQuery.CreateBlobStream(ADOQuery.FieldByName('reData'),bmRead) as TMemoryStream); try reData.Lines.LoadFromStream(MemoryStream); finally MemoryStream.Free; end; end; finally ADOQuery.Close; end; finally ADOConnection.Close; end; // reData.Lines.LoadFromFile('c:\test.rtf'); end;
procedure TfrmMain.btnSaveClick(Sender: TObject); var MemoryStream : TMemoryStream; begin ADOConnection.Open; MemoryStream := TMemoryStream.Create; try ADOQuery.SQL.Text := 'insert into data (reData) values(:reData)'; reData.Lines.SaveToStream(MemoryStream); MemoryStream.Seek(0,soFromBeginning); ADOQuery.Parameters.ParamByName('reData').LoadFromStream(MemoryStream,ftFmtMemo); ADOQuery.ExecSQL; finally MemoryStream.Free; ADOConnection.Close; end; // reData.Lines.SaveToFile('c:\test.rtf'); end;
Et spørgsmål er om man skal bruge de DBxxx komponenter eller om man skal holde det separeret - sådan som det skitseres her. Jeg vil altid - belært af erfaringen - bruge denne løsning. Det andet er som at tisse i bukserne for at holde varmen. Senere bliver det lappeløsninger på lappeløsninger.
HRC: Hvis nu man kun har en RichEdit som ikke er en DB komponent og vil bruge den løsning du har lavet her. Hvordan får man indhold af en DBEdit in i samme record?
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.