Results 1 to 3 of 3

Thread: Conversie van een string

  1. #1

    Conversie van een string

    Hallo allemaal,

    Onderstaande procedure werkt niet goed. De bedoeling is dat HStr := 'ORDER BY @DA, @BA, @CA';
    wordt vervangen door HStr := 'ORDER BY @@4, @@1, @@2'; maar het resultaat is HStr := 'ORDER BY @@4, @BA, @CA';

    Ik heb al van alles geprobeerd maar ik krijg het niet voorelkaar. Hoe is dit op te lossen?

    H.G. Frans Dubbeld

    Code:
    PROCEDURE TForm1.Button1Click(Sender : TObject) ;
    
      PROCEDURE Conversie_KolomNamen_;//(StringGrid2: TStringGrid; StringGrid2: TStringGrid);
        // Deze procedure vervangt de kolomnaam van de database
        // door het kolomnummer (layout @nn, nn kolomnummer)
        VAR
          I, R, C:  INTEGER;
          HStr,HStr1:  STRING;
          KolomNaam: STRING;
          Lijn : STRING;
    
        FUNCTION ExactWordInString(Text: STRING; WORD : STRING) : BOOLEAN;
          VAR
            I : INTEGER;
    
          BEGIN
            Text := UpperCase(Text);
            WORD := UpperCase(WORD);
            Text := StringReplace(Text,#32,'',[rfReplaceAll]);
            FOR I := 0 TO 64 DO
              WORD := StringReplace(WORD, Chr(I),#32,[]);
            Text := #32 + Text + #32;
            WORD := #32 + WORD + #32;
            ExactWordInString := False;
            ExactWordInString := Pos(Text, WORD) <> 0;
          END;
    
        BEGIN
          FOR C := 0 TO StringGrid2.ColCount - 1 DO // Kolomnamen uit database
          BEGIN
            KolomNaam := Trim(UpperCase(StringGrid2.Cells[C, 0]));
            HStr      := 'ORDER BY @DA, @BA, @CA';
            IF ExactWordInString(KolomNaam,HStr) = True THEN
              //If Pos(KolomNaam,UpperCase(Trim(HStr))) <> 0 then
            BEGIN
              HStr := StringReplace(HStr, KolomNaam, '@' + IntToStr(C)+#32, [rfIgnoreCase]);
              Label1.Caption := Trim(HStr);
              Memo1.Lines.Add(IntToStr(C)+'    '+HStr);
            END;
          END;
        END;
    
      BEGIN
        Conversie_KolomNamen_;
      END;
    
    PROCEDURE TForm1.FormCreate(Sender : TObject) ;
      VAR
        C : INTEGER;
    
      BEGIN
        FOR C := 0 TO 5 DO
        BEGIN
          StringGrid2.Cells[C,0] := Chr(C+65)+'A';
        END ;
      END;
    
    END.

  2. #2
    Ik begrijp niet helemaal wat je in die ExactWordInString aan het doen bent.
    (alle chr(0)-chr(64) omzetten naar spatie in die for loop ???).

    Maar waarom doe je het niet met die Pos(KolomNaam,UpperCase(Trim(HStr))).

    Alleen zou ik het dan zo doen:
    Delphi Code:
    1. KolomNaam := Trim(UpperCase(StringGrid2.Cells[C, 0]));
    2. HStr := 'ORDER BY @DA, @BA, @CA';
    3. if Pos('@' + KolomNaam, UpperCase(Trim(HStr))) <> 0 then
    4. begin
    5.   HStr := StringReplace(HStr, '@' + KolomNaam, '@@' + IntToStr(C), [rfIgnoreCase]);
    6.   Label1.Caption := Trim(HStr);
    7.   Memo1.Lines.Add(IntToStr(C)+'    '+HStr);
    8. end;
    Ik ga er dan wel vanuit dan je niet een @DA en een @DAB hebt. Dat je dus aan de minimale veld-lengte kunt zien om welke kolom het gaat.

    PS. Kun je in de database die je gebruikt geen gebruik maken van
    SQL Code:
    1. ORDER BY 4, 1, 2
    Lijkt me veel makkelijker
    Last edited by rvk; 21-Sep-17 at 22:38.

  3. #3
    Probleem opgelost.

    Met de volgende code werkt het wel.

    Bedankt, Frans Dubbeld

    Code:
    procedure TForm1.Button1Click(Sender: TObject);
      var
        C: integer;
        KolomNaam, HStr: string;
    
      begin
        HStr := 'ORDER BY @DA, @BA, @CA';
        for C := 0 to StringGrid2.ColCount - 1 do // Kolomnamen uit database
        begin
          KolomNaam := Trim(UpperCase(StringGrid2.Cells[C, 0]));
          begin
            HStr := StringReplace(HStr, KolomNaam, '@' + IntToStr(C) + #32, [rfIgnoreCase]);
          end;
        end;
        Label1.Caption := Trim(HStr);
        Memo1.Lines.Add(IntToStr(C) + '    ' + HStr);
      end;
    
    procedure TForm1.FormCreate(Sender: TObject);
      var
        C: integer;
      begin
        for C := 0 to 5 do
          StringGrid2.Cells[C, 0] := Chr(C + 65) + 'A';
      end;

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •