![]() |
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:
|
Re: Missing operator in verbindung mit ORD
Hallo,
UpperCase liefert einen String zurück. Ord benötigt einen Char. Gruß xaromz |
Re: Missing operator in verbindung mit ORD
Was ist BWidth? Eine Funktion? Wenn es was anderes ist, wird diese Syntax garantiert nicht funktionieren.
|
Re: Missing operator in verbindung mit ORD
Zitat:
Habe es aber neu definiert!
Delphi-Quellcode:
gruß
TSplitStrArray = array of String;
BWidth : TSplitStrArray; 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; |
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:
Aber vielleicht beschreibst du besser, was du eigentlich erreichen willst.
IntX := IntX + Ord(UpCase(StrS[1])) - 65;
Grüße |
Re: Missing operator in verbindung mit ORD
Zitat:
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:
hoffentlich verstehst du was ich meine.
VB: IntX = IntX + Int(BWidth(Asc(UCase(StrS)) - 65)
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ß |
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). |
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ß |
Re: Missing operator in verbindung mit ORD
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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! |
Re: Missing operator in verbindung mit ORD
Moin EWeiss,
Zitat:
Delphi-Quellcode:
schreiben.
ord(UpperCase(StrS[1]))
|
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 |
Re: Missing operator in verbindung mit ORD
Zitat:
Ahhhh also IntX := IntX + BWidth(ORD(UpperCase(StrS[1])) - 65); Dann wirds gehn... ? Werde es mal testen. Danke ! Gruß |
Re: Missing operator in verbindung mit ORD
PUSCH...
Nein geht trotzdem nicht. Hmmm .. Steh jetzt auf den Schlauch :) GRuß |
Re: Missing operator in verbindung mit ORD
Vielleicht
Delphi-Quellcode:
?
IntX := IntX + BWidth(ORD(UpperCase(StrS)[1]) - 65);
|
Re: Missing operator in verbindung mit ORD
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Da geht nichts mit TCanvas.TextWidth sorry. gruß |
Re: Missing operator in verbindung mit ORD
Zitat:
Zitat:
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: |
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.
|
Re: Missing operator in verbindung mit ORD
Zitat:
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ß |
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:
Grüße
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 // ... |
Re: Missing operator in verbindung mit ORD
Zitat:
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ß |
Re: Missing operator in verbindung mit ORD
Irgendetwas stimmt mit der schleife oder dem Array StrView noch nicht.
Delphi-Quellcode:
Es sollte eigentlich eine länge von 120 herauskommen abhängig vom übergebenen string
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; Resultat ist aber 115! Habs gescheckt keine ahnung warum. Aufgerufen wird die Function mit
Delphi-Quellcode:
Bis GEN wird angezeigt rest ist verschluckt :( Show Pic!
picTopText.Width := GetBitArray('Gen Bitmap Skin Test') + 14;
Gruß |
Re: Missing operator in verbindung mit ORD
Ok hat sich erledigt!
Result = 115 wurde deshalb ausgegeben weil ich bedingt durch ORD[]
Delphi-Quellcode:
mit den zähler IntI := 1 anfagen mußte.
For IntI := 1 To Length(StrView) do
So geht es nun..
Delphi-Quellcode:
Bleibt noch eine Frage offen.
For IntI := 1 To Length(StrView) + 1 do
Delphi-Quellcode:
Hier wird die picTopTextSrc.Width nicht neugesetzt!
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; 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