23. december 2005 - 22:18Der er
8 kommentarer og 1 løsning
Hent og erstat database fletter fra et RichEdit dokument
Hej Allesammen.
Så er jeg på spil igen.
Denne gang har jeg bruge at læse og erstatte felter i et richedit dokument. Dokumentet kunne se ud som nedenstående, hvor texten imellem <# og > angiver en StringField, men som det kan ses af kode får jeg feltet leveret som en sting, hvad gør jeg ??
Nummer :<#BdpladsNummer> Navn :<#BdpladsNavn> Adresse :<#BdpladsAdresse> By :<#BdpladsByr>
with RichEdit1 do begin while FoundTo < Length(Text) do begin FoundAt := FindText('<#',FoundAt,Length(Text),[]); if FoundAt <> -1 then begin SetFocus; SelStart := FoundAt; trin FoundTo := FindText('>',FoundAt,Length(Text),[]); SelLength := (FoundTo+1) - FoundAt; Size := SelLength; Inc(Size); GetMem(Buffer, Size); GetSelTextBuf(Buffer,Size); S := StrPas(Buffer); Delete(S,1,2); Delete(S,length(S),1); SelText := S.AsString; // dette virker ikke //Seltext := KundeNavn.AsString: dette virker end else exit; end; end;
var i,Start,Slut : integer; Temp,Field : string; begin for i:=0 to RichEdit.Lines.Count-1 do begin Start:=pos('<#',RichEdit.Lines[i]); if Start>0 then begin Temp:=RichEdit.Lines[i]; Slut:=posEx('>',Temp,Start); Field:=copy(Temp,Start+2,Slut-Start-3); Delete(Temp,Start,Slut-Start); Insert(Temp,Tabel.FieldByName[Field].AsString,Start); RichEdit.Lines[i]:=Temp; end; end; end;
1. Den kan ikke håndtere flere datafelter i en linie. 2. En stor fordel ved at bruge StringField, er at felterne kan være formateret på forhånd. 3. Jeg arbejder med flere forskellige databaser.
if pos('#navn#',self.RichEdit1.Text) <> 0 then self.RichEdit1.Text := stringreplace(self.RichEdit1.Text,'#navn#','Svend rik',[rfReplaceAll]);
skrevet med database felter kan koden se således ud
if pos('#navn#',self.RichEdit1.Text) <> 0 then self.RichEdit1.Text := stringreplace(self.RichEdit1.Text,'#navn#',self.Table1.FieldByName('NAME').AsString,[rfReplaceAll]);
Det er også en måde at gøre det på, men jeg skla arbejde med mange forskellige dokumenter og databaser, så min kode er blevet som følg. den kan sikkert skrives bedre.
procedure TPrintFrm.ConvertText; var FoundAt, FoundTo, size, Dot: Integer; Buffer: Pchar; S,X,Y: String; begin FoundAt := 0; FoundTo := 0; with RichEdit1 do begin while FoundTo < Length(Text) do begin FoundAt := FindText('<#',FoundAt,Length(Text),[]); if FoundAt <> -1 then begin SetFocus; SelStart := FoundAt; FoundTo := FindText('>',FoundAt,Length(Text),[]); SelLength := (FoundTo+1) - FoundAt; Size := SelLength; Inc(Size); GetMem(Buffer, Size); GetSelTextBuf(Buffer,Size); S := StrPas(Buffer); Dot := Pos('.',S); Y := Copy(S,3,Dot-3); X := Copy(S,(Dot+1),(Length(S)-Dot-1)); If Y = 'Kunde' then SelText := FieldConv(Kunde.FieldByName(X).AsString, Kunde.FieldByName(X).DataType); If Y = 'Bdplads' then SelText := FieldConv(Bdplads.FieldByName(X).Value, Bdplads.FieldByName(X).DataType); If Y = 'Bdtype' then SelText := FieldConv(Bdtype.FieldByName(X).AsString, Bdtype.FieldByName(X).DataType); If Y = 'Bdanm' then SelText := FieldConv(Bdanm.FieldByName(X).AsString, Bdanm.FieldByName(X).DataType); If Y = 'Salgsliste' then SelText := FieldConv(Salgsliste.FieldByName(X).AsString, Salgsliste.FieldByName(X).DataType); If Y = 'Venteliste' then SelText := FieldConv(Venteliste.FieldByName(X).AsString, Venteliste.FieldByName(X).DataType); end else begin exit;
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.