Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Missing operator in verbindung mit ORD (https://www.delphipraxis.net/78603-missing-operator-verbindung-mit-ord.html)

EWeiss 7. Okt 2006 17:50


Missing operator in verbindung mit ORD
 
Kleines Problem bei der umsetzung dieser zeile!

StrS : String;
IntX : Integer;
BWidth : Variant;

Delphi-Quellcode:
IntX := IntX + BWidth(ORD(UpperCase(StrS)) - 65);
Zitat:

[Pascal Error] frmGen.pas(205): E2066 Missing operator or semicolon
gruß

xaromz 7. Okt 2006 18:10

Re: Missing operator in verbindung mit ORD
 
Hallo,

UpperCase liefert einen String zurück. Ord benötigt einen Char.

Gruß
xaromz

3_of_8 7. Okt 2006 18:12

Re: Missing operator in verbindung mit ORD
 
Was ist BWidth? Eine Funktion? Wenn es was anderes ist, wird diese Syntax garantiert nicht funktionieren.

EWeiss 7. Okt 2006 18:25

Re: Missing operator in verbindung mit ORD
 
Zitat:

Zitat von 3_of_8
Was ist BWidth? Eine Funktion? Wenn es was anderes ist, wird diese Syntax garantiert nicht funktionieren.

BWidth : Variant;

Habe es aber neu definiert!

Delphi-Quellcode:
TSplitStrArray = array of String;
BWidth      : TSplitStrArray;
gruß

Edit: hier mal die ganze Function!

Delphi-Quellcode:
function Tfrm_Gen.GetBitArray(StrView: String): Single;
Var
 IntI        : Integer;          //Zähler
 StrPosX     : String;           //X Position im Bitmap
 StrPosW     : String;           //Weite des Buchstaben
 IntPos      : Dword;            //Zähler für die Buchstabenweite

 DelemiterCol : TCOLOR;           //Delemiter als Farbe
 IntDelPos   : Integer;          //Aktuelle Delemiter Position
 ColFound    : Boolean;          //Farbe gefunden, ergebnis = Buchstabenweite
 BWidth      : TSplitStrArray;   //Resultat der gefundenen Buchstabenweiten Spliten
 PosX        : Variant;          //
 NewPos      : Dword;
 StrS        : String;
 IntX        : Integer;

 begin
    IntPos := 0;
    IntX  := 0;
    IntDelPos := 0;
    ColFound := False;
    NewPos := 0;

    PicMapDC := PicMap.Picture.Bitmap.Canvas.Handle;
    //******************** Schleife zum ermitteln der Buchstabenweite *********************
    ///////////////////////////////////////////////////////////////////////////////////////
    //Ermitteln der Delemiter Farbe
    DelemiterCol := GetPixel(PicMapDC, 0, 88);

    //Schleife durchlaufen bis 26* die Delemiter Farbe gefunden wurde
    For IntI := 1 To picMap.Width do
        begin
        //Raus hier wenn Farbe 26* gefunden
        If IntDelPos = 26 Then Break;

        //Aktuelle Position der Buchstabenweite um eins erhöhen
        inc(IntPos);
        //Wenn aktuelle position im Bitmap die gleiche Farbe
        //enthält wie DelemiterCol ..
        If GetPixel(PicMapDC, IntI, 88) = DelemiterCol Then
            begin
            If IntDelPos <= 24 Then
              begin
                //Position zum StrPosX addieren und Delemiter komma anhängen
                StrPosX := StrPosX + IntToStr(IntI) + ',';
              end
             Else
                //Letze Position zum StrPosX addieren ohne Delemiter
                StrPosX := StrPosX + IntToStr(IntI);
            //Zähler für Farbe um eins erhöhen
            inc(IntDelPos);
            //Farbe gefunden
            ColFound := True;
            End;
        //wenn Farbe gefunden
        If ColFound Then
          begin
            //weite des Buchstaben zum StrPosW addieren
            If IntDelPos <= 25 Then
             begin
                StrPosW := StrPosW + IntToStr(IntPos - 1) + ',';
            end
            Else
                StrPosW := StrPosW + IntToStr(IntPos - 1);
            //Buchstabenweite löschen
            IntPos := 0;
        End;
        //Farbe gefunden zurück setzen
        ColFound := False;
    end;
    BWidth := Split(StrPosW, ',');
    PosX := Split(StrPosX, ',');

    For IntI := 0 To Length(StrView) do
       begin
        StrS := MidStr(StrView, IntI + 1, 1);
        If StrS > ' ' Then
            begin
//            IntX := IntX + BWidth(ORD(UpperCase(StrS)) - 65);
            end
         Else
            //Bei Leerstring 5 hinzufügen
            IntX := IntX + 5;

        If StrS > ' ' Then
        begin
//            IntPos := PosX(ORD(UpperCase(StrS)) - 65) - BWidth(ORD(UpperCase(StrS)) - 65);
        end
        Else
            IntPos := 61;

       
        If (IntI > 0) And (StrS > ' ') Then
        begin
//            NewPos := IntX - BWidth(ORD(UpperCase(StrS)) - 65);
        end
        Else
        If IntI = 0 Then
          NewPos := IntX - 6
        Else
          NewPos := IntX - 5;


        If StrS > ' ' Then
        begin
            picTopTextSrc.Width := (IntX * 15);
            SetImage(picTopTextSrc, NewPos, 0, IntX, 7, picMap, IntPos, 88);
        end
        Else
            picTopTextSrc.Width := IntX * 15;
            SetImage(picTopTextSrc, NewPos, 0, IntX, 7, picMap, IntPos, 4);
        end;

    GetBitArray := IntX + Length(StrS) - 1;

End;

marabu 7. Okt 2006 18:32

Re: Missing operator in verbindung mit ORD
 
Hallo Emil,

wenn ich deine gegebene Code-Zeile in etwas sinnvolles umforme, dann kommt das hier heraus:

Delphi-Quellcode:
 IntX := IntX + Ord(UpCase(StrS[1])) - 65;
Aber vielleicht beschreibst du besser, was du eigentlich erreichen willst.

Grüße

EWeiss 7. Okt 2006 18:38

Re: Missing operator in verbindung mit ORD
 
Zitat:

Zitat von marabu
Hallo Emil,

wenn ich deine gegebene Code-Zeile in etwas sinnvolles umforme, dann kommt das hier heraus:

Delphi-Quellcode:
 IntX := IntX + Ord(UpCase(StrS[1])) - 65;
Aber vielleicht beschreibst du besser, was du eigentlich erreichen willst.

Grüße

Ich möchte den ASCII code ermitteln!
Beispiel UpperCase ist ein Großbuchstabe "B" davon den asc(wert - 65) welcher zu IntX addiert werden soll.
BWidth ist die weite des Buchstaben der oben im Quelltext ermittelt wird!

Code:
VB: IntX = IntX + Int(BWidth(Asc(UCase(StrS)) - 65)
hoffentlich verstehst du was ich meine.

EDIT: Die abfrage ist richtig konnte aber für Asc in Delphi nur ORD ausfindig machen.
Da gibt es aber leider das oben gezeigte problem.

gruß

Christian Seehase 7. Okt 2006 19:01

Re: Missing operator in verbindung mit ORD
 
Moin EWeiss,

Du kannst nur nicht aus einem String einen ASCII-Code ermitteln, sondern musst Dich schon für ein Zeichen entscheiden (wie wäre wohl der ASCII-Code von 'ABCDE'? ;-)), indem Du den Index des gewünschten Zeichens angibst (siehe Marabus Beitrag).

EWeiss 7. Okt 2006 19:02

Re: Missing operator in verbindung mit ORD
 
Also dachte eigentlich der Code mit den Kommentierten Zeilen erklärt das von sich aus.

Ich habe ein Bitmap!
In diesen befindet sich ein Strip bestehend aus Buchstaben 24 an der zahl.

Die koordinaten der Buchstaben im strip sind in der höhe gleich können aber in der weite
unterschiedlich sein.

Vor und hinter den Buchstaben befindet sich immer die gleiche Farbe!
Mit dieser Farbe wird der Strip gescannt das ASCII Zeichen ermittelt und die weite abhängig
von der Farbe.

Das ganze wird in ein String Array addiert.
Welches nachher abhängig vom übergebenen Text auseinander genommen und in richtiger
Reihenfolge wieder zusammen gefügt wird.
Dabei wird das Zeichen sowie die weite des gemalten Buchstaben berücksichtig.

gruß

EWeiss 7. Okt 2006 19:04

Re: Missing operator in verbindung mit ORD
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Christian Seehase
Moin EWeiss,

Du kannst nur nicht aus einem String einen ASCII-Code ermitteln, sondern musst Dich schon für ein Zeichen entscheiden (wie wäre wohl der ASCII-Code von 'ABCDE'? ;-)), indem Du den Index des gewünschten Zeichens angibst (siehe Marabus Beitrag).

Verstehe ich nicht funktioniert in VB doch auch! ;)
Ich mache nichts anderes als den code von meinen MediaPlayer in Delphi zu übersetzen.
Und der läuft. ;)


Das geht nicht weil sich das zeichen in einem String Array befindet!
Kann es nicht so machen wie marabu es beschrieben hat.

gruß

Hier ein Test!

Christian Seehase 7. Okt 2006 19:08

Re: Missing operator in verbindung mit ORD
 
Moin EWeiss,

Zitat:

Zitat von EWeiss
Verstehe ich nicht funktioniert in VB doch auch! ;)

das liegt aber daran, dass ASC in VB bei einem String immer das erste Zeichen des Strings nimmt, also müsstest Du in Delphi

Delphi-Quellcode:
ord(UpperCase(StrS[1]))
schreiben.

marabu 7. Okt 2006 19:10

Re: Missing operator in verbindung mit ORD
 
Für die einzelnen Zeichen eines Strings s[i] kannst du mittels Ord(s[i]) den Codewert ermitteln. Wenn du aber den Platz berechnen möchtest, den eine Zeichenkette bei gegebenem Font einnimmt, dann geht das mit TCanvas.TextWidth(s) leichter.

Grüße

EWeiss 7. Okt 2006 19:10

Re: Missing operator in verbindung mit ORD
 
Zitat:

Zitat von Christian Seehase
Moin EWeiss,

Zitat:

Zitat von EWeiss
Verstehe ich nicht funktioniert in VB doch auch! ;)

das liegt aber daran, dass ASC in VB bei einem String immer das erste Zeichen des Strings nimmt, also müsstest Du in Delphi

Delphi-Quellcode:
ord(UpperCase(StrS[1]))
schreiben.


Ahhhh also IntX := IntX + BWidth(ORD(UpperCase(StrS[1])) - 65);

Dann wirds gehn... ?
Werde es mal testen.


Danke !

Gruß

EWeiss 7. Okt 2006 19:16

Re: Missing operator in verbindung mit ORD
 
PUSCH...

Nein geht trotzdem nicht.

Hmmm .. Steh jetzt auf den Schlauch :)

GRuß

mkinzler 7. Okt 2006 19:19

Re: Missing operator in verbindung mit ORD
 
Vielleicht
Delphi-Quellcode:
IntX := IntX + BWidth(ORD(UpperCase(StrS)[1]) - 65);
?

EWeiss 7. Okt 2006 19:21

Re: Missing operator in verbindung mit ORD
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von marabu
Für die einzelnen Zeichen eines Strings s[i] kannst du mittels Ord(s[i]) den Codewert ermitteln. Wenn du aber den Platz berechnen möchtest, den eine Zeichenkette bei gegebenem Font einnimmt, dann geht das mit TCanvas.TextWidth(s) leichter.

Grüße

Es ist kein Font es ist ein Strip gezeichnet in einen Bitmap.
Da geht nichts mit TCanvas.TextWidth sorry.

gruß

EWeiss 7. Okt 2006 19:24

Re: Missing operator in verbindung mit ORD
 
Zitat:

Zitat von mkinzler
Vielleicht
Delphi-Quellcode:
IntX := IntX + BWidth(ORD(UpperCase(StrS)[1]) - 65);
?

Nein nichts zu machen :|

Zitat:

[Pascal Error] frmGen.pas(211): E2066 Missing operator or semicolon
[Pascal Error] frmGen.pas(211): E2015 Operator not applicable to this operand type
gruß

EDIT: Ja '1' wird nachher ersetzt mit dem richtigen wert aus dem ASCII zeichen satz
wäre bei "A" DEZ = 65
Das habe ic hschon verstanden ... Aber es läuft trotzdem nicht :oops:

mkinzler 7. Okt 2006 19:31

Re: Missing operator in verbindung mit ORD
 
Splitte diese Zeile doch mal auf eun führe einen Schritt nach dem anderen durch, um zu sehen, was den Fehler verursacht.

EWeiss 7. Okt 2006 19:42

Re: Missing operator in verbindung mit ORD
 
Zitat:

Zitat von mkinzler
Splitte diese Zeile doch mal auf eun führe einen Schritt nach dem anderen durch, um zu sehen, was den Fehler verursacht.

Danke für den Rat
Komme aber gar nicht erst zum debuggen umd das Problem beheben zu können.

Diese Zeile "Asc(UCase(StrS)) - 65)" wenn StrS = "E" ist
liefert den wert 4 zurück was ja auch richtig ist.

Verstehe nicht das da so probleme sind!

gruß

marabu 7. Okt 2006 19:43

Re: Missing operator in verbindung mit ORD
 
Hallo Emil,

als ich Beitrag #5 schrieb habe ich deinen Beitrag #4 noch nicht gekannt - alles wird klar:

Delphi-Quellcode:
begin
    // ...

    For IntI := 1 To Length(StrView) do // index läuft ab 1
    begin
      //  StrS := MidStr(StrView, IntI + 1, 1); // nicht nötig
      if StrView[IntI] <> ' '
        then IntX := IntX + BWidth[Ord(UpCase(StrView[IntI])) - 65]; // nicht () sondern []
        else Inc(IntI(5); //Bei Leerstring 5 hinzufügen
    // ...
Grüße

EWeiss 7. Okt 2006 19:57

Re: Missing operator in verbindung mit ORD
 
Zitat:

Zitat von marabu
Hallo Emil,

als ich Beitrag #5 schrieb habe ich deinen Beitrag #4 noch nicht gekannt - alles wird klar:

Delphi-Quellcode:
begin
    // ...

    For IntI := 1 To Length(StrView) do // index läuft ab 1
    begin
      //  StrS := MidStr(StrView, IntI + 1, 1); // nicht nötig
      if StrView[IntI] <> ' '
        then IntX := IntX + BWidth[Ord(UpCase(StrView[IntI])) - 65]; // nicht () sondern []
        else Inc(IntI(5); //Bei Leerstring 5 hinzufügen
    // ...
Grüße

Danke das hat mir sehr geholfen.
werde es mal bei den anderen ebenfalls ändern und mal debuggen.

Wie immer Daumen hoch und Danke!
Wenns nicht klappt melde ich mich nochmal ;)

EDIT: Was so ne klammer doch ausmacht :-D

gruß

EWeiss 8. Okt 2006 16:42

Re: Missing operator in verbindung mit ORD
 
Irgendetwas stimmt mit der schleife oder dem Array StrView noch nicht.

Delphi-Quellcode:
function Tfrm_Gen.GetBitArray(StrView: String): Integer;
Var
 IntI        : Integer;    //Zähler
 StrPosX     : String;     //X Position im Bitmap
 StrPosW     : String;     //Weite des Buchstaben
 IntPos      : Dword;      //Zähler für die Buchstabenweite

 DelemiterCol : TCOLOR;     //Delemiter als Farbe
 IntDelPos   : Integer;    //Aktuelle Delemiter Position
 ColFound    : Boolean;    //Farbe gefunden, ergebnis = Buchstabenweite
 BWidth      : Variant;    //Resultat der gefundenen Buchstabenweiten Spliten
 PosX        : Variant;    //
 NewPos      : Dword;
 StrS        : String;
 IntX        : Integer;

 begin
    IntPos := 0;
    IntDelPos := 0;
    ColFound := False;

    PicMapDC := PicMap.Picture.Bitmap.Canvas.Handle;
    //******************** Schleife zum ermitteln der Buchstabenweite *********************
    ///////////////////////////////////////////////////////////////////////////////////////
    //Ermitteln der Delemiter Farbe
    DelemiterCol := GetPixel(PicMapDC, 0, 88);

    //Schleife durchlaufen bis 26* die Delemiter Farbe gefunden wurde
    For IntI := 1 To picMap.Width do
        begin
        //Raus hier wenn Farbe 26* gefunden
        If IntDelPos = 26 Then Break;

        //Aktuelle Position der Buchstabenweite um eins erhöhen
        inc(IntPos);
        //Wenn aktuelle position im Bitmap die gleiche Farbe
        //enthält wie DelemiterCol ..
        If GetPixel(PicMapDC, IntI, 88) = DelemiterCol Then
            begin
            If IntDelPos <= 24 Then
              begin
                //Position zum StrPosX addieren und Delemiter komma anhängen
                StrPosX := StrPosX + IntToStr(IntI) + ',';
              end
             Else
                //Letze Position zum StrPosX addieren ohne Delemiter
                StrPosX := StrPosX + IntToStr(IntI);
            //Zähler für Farbe um eins erhöhen
            inc(IntDelPos);
            //Farbe gefunden
            ColFound := True;
            End;
        //wenn Farbe gefunden
        If ColFound Then
          begin
            //weite des Buchstaben zum StrPosW addieren
            If IntDelPos <= 25 Then
             begin
                StrPosW := StrPosW + IntToStr(IntPos - 1) + ',';
            end
            Else
                StrPosW := StrPosW + IntToStr(IntPos - 1);
            //Buchstabenweite löschen
            IntPos := 0;
        End;
        //Farbe gefunden zurück setzen
        ColFound := False;
    end;
    BWidth := Split(StrPosW, ',');
    PosX := Split(StrPosX, ',');

    //******************************** Bis hier stimmt alles *******************************\\

    IntX := 0;
    For IntI := 1 To Length(StrView) do
       begin      
        // Wird benötigt zum Debuggen um den ASCII Wert als String anzuzeigen!
        StrS := MidStr(StrView, IntI , 1);
        // Übergebe Buchstabe abhängig vom aktiven Index
        If StrView[IntI] > ' ' Then
            begin
            IntX := IntX + BWidth[Ord(UpCase(StrView[IntI])) - 65];
            end Else
            //Bei Leerstring 5 hinzufügen
            IntX := IntX + 5;

        If StrView[IntI] > ' ' Then
        begin
            IntPos := PosX[Ord(UpCase(StrView[IntI])) - 65] - Int(BWidth[Ord(UpCase(StrView[IntI])) - 65]);
        end Else
            IntPos := 61;

        If (IntI > 1) And (StrView[IntI] > ' ') Then
        begin
            NewPos := IntX - BWidth[ORD(UpCase(StrView[IntI])) - 65];
        end Else If IntI = 1 Then
          NewPos := IntX - 6
        Else
          NewPos := IntX - 5;


        If StrView[IntI] > ' ' Then
        begin
            picTopTextSrc.Width := IntX;
            SetImage(picTopTextSrc, NewPos, 0, IntX, 7, picMap, IntPos, 88);
        end else
        begin
          picTopTextSrc.Width := IntX ;
          SetImage(picTopTextSrc, NewPos, 0, IntX, 7, picMap, IntPos, 4);
        end;
    end;
    Result := IntX + Length(StrView[IntI]) - 1;

End;
Es sollte eigentlich eine länge von 120 herauskommen abhängig vom übergebenen string
Resultat ist aber 115! Habs gescheckt keine ahnung warum.

Aufgerufen wird die Function mit

Delphi-Quellcode:
picTopText.Width := GetBitArray('Gen Bitmap Skin Test') + 14;
Bis GEN wird angezeigt rest ist verschluckt :( Show Pic!

Gruß

EWeiss 8. Okt 2006 19:51

Re: Missing operator in verbindung mit ORD
 
Ok hat sich erledigt!

Result = 115 wurde deshalb ausgegeben weil ich bedingt durch ORD[]

Delphi-Quellcode:
For IntI := 1 To Length(StrView) do
mit den zähler IntI := 1 anfagen mußte.

So geht es nun..
Delphi-Quellcode:
For IntI := 1 To Length(StrView) + 1 do
Bleibt noch eine Frage offen.

Delphi-Quellcode:
        If StrView[IntI] > ' ' Then
        begin
            // neue picTopTextSrc weite zuweisen abhängig von
            // der aktuellen gesamtweite(IntX)
            picTopTextSrc.Width := IntX;
            SetImage(picTopTextSrc, NewPos, 0, IntX, 7, picMap, IntPos, 88);
        end else
        begin
          // Bei Leerstring wird andere Y Position benötigt
          picTopTextSrc.Width := IntX;
          SetImage(picTopTextSrc, NewPos, 0, IntX, 7, picMap, IntPos, 4);
        end;
Hier wird die picTopTextSrc.Width nicht neugesetzt!
Obwohl so wie man sehen kann diese sich auf die neue weite IntX setzen sollte.
Jetzt sag mir mal jemand was das denn nun wieder für ein Problem ist!

Der Schriftzug wird nur korrekt angezeigt wenn ich vorher die weite in der Form setze
aber das kann es ja wohl nicht sein.

gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz