Avatar billede fhansen Praktikant
23. december 2005 - 22:18 Der 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;
Avatar billede kroning Nybegynder
23. december 2005 - 22:25 #1
Nu har jeg ikke rodet så meget med richedit men kan man ikke lave en simpel for next på alle linier og så bruge pos til at finde <# med?
Avatar billede kroning Nybegynder
23. december 2005 - 22:31 #2
f.eks.: (utestet)

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;
Avatar billede fhansen Praktikant
23. december 2005 - 23:23 #3
Hej Kroning.

Jeg får flg. problemmer med dit kode forslag.

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.


Men du er helt sikker på rette spor.


Hilsen

Finn
Avatar billede kroning Nybegynder
24. december 2005 - 00:37 #4
Nå ja, jeg havde ikke lige tænkt på formateringen i en richedit.
Avatar billede kroning Nybegynder
24. december 2005 - 08:23 #5
Men virker det så ikke hvis du skriver:
Seltext:=DinDB.FieldByName[S].AsString;
Avatar billede coladrenge Nybegynder
27. december 2005 - 18:53 #6
hej

prøv følgende

  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]);


mv
jhc
Avatar billede fhansen Praktikant
30. december 2005 - 00:00 #7
Hej

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;

        end;

      end;
    end;
end;
Avatar billede coladrenge Nybegynder
31. december 2005 - 09:57 #8
hej

nu var det bare for at give dig et eksempel på hvordan det kan gøres.

I de programmer hvor vi bruger breve og formularer bruger vi WPTools - se eksempelvis på www.wptools.com
Avatar billede fhansen Praktikant
16. februar 2007 - 01:02 #9
lukker
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester