Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi StringReplace verursacht AV (https://www.delphipraxis.net/190480-stringreplace-verursacht-av.html)

EWeiss 7. Okt 2016 17:43


StringReplace verursacht AV
 
Delphi-Quellcode:
var
  Txt: PWideChar;
  tmpTxt: WideString;

Txt := PWideChar(SkinEngine.GetCTLText(PDis.hwndItem));
tmpTxt := StringReplace(string(Txt), '&','', [rfReplaceAll]);
txt Rückgabe ist "Ö&ffnen"
tmpTxt soll jetzt den Char "&" entfernen aber es kracht mal wieder.

Kann nicht erkennen wo hier wieder ein Fehler sein soll.
read of address ...

gruss

Jim Carrey 7. Okt 2016 17:48

AW: StringReplace verursacht AV
 
Ich habe bei mir mal folgendes getestet und ich habe keine AV bekommen:
Delphi-Quellcode:
var
 Txt: PWideChar;
 tmpTxt: WideString;
begin
 Txt := 'Ö&ffnen';
 tmpTxt := StringReplace(string(Txt), '&', '', [rfReplaceAll]);
end;
Also entweder wird hier auf eine andere StringReplace-Funktion zurückgegriffen oder es gibt einen Fehler in der Zeile, wo der Variable "Txt" etwas zugewiesen wird.

himitsu 7. Okt 2016 17:50

AW: StringReplace verursacht AV
 
Delphi-Quellcode:
string(Txt)

Weg mit dem schrottigen Cast und wenn nicht, dann soll man sich auch nicht wundern, wenn man die automatische Speicherverwaltung der Strings durcheinander bringt.


Delphi-Referenz durchsuchenStripHotkey

Jim Carrey 7. Okt 2016 17:56

AW: StringReplace verursacht AV
 
Frage neben bei:
was macht StripHotkey anders als StringReplace?

Dalai 7. Okt 2016 18:06

AW: StringReplace verursacht AV
 
Zitat:

Zitat von Jim Carrey (Beitrag 1350154)
was macht StripHotkey anders als StringReplace?

StripHotkey entfernt nicht nur die im Westen üblichen Ampersands sondern auch die in Asien üblichen Hotkeys in Klammern, z.B. "Open (O)".

Grüße
Dalai

Luckie 7. Okt 2016 18:32

AW: StringReplace verursacht AV
 
Aber warum nur? :? Woher soll der Nutzer denn wissen, welches der Hotkey für die Schaltfläche ist?

himitsu 7. Okt 2016 18:47

AW: StringReplace verursacht AV
 
Und es lässt geqoutede Hotkeys dequoted zurück.

Delphi-Quellcode:
&Hallo && Tschüss

EWeiss 7. Okt 2016 18:59

AW: StringReplace verursacht AV
 
Zitat:

Zitat von Luckie (Beitrag 1350158)
Aber warum nur? :? Woher soll der Nutzer denn wissen, welches der Hotkey für die Schaltfläche ist?

Weil er in meiner DrawText Funktion es so zeichnet wie angegeben.

Ohne das entfernen steht auf meinen Button der Text so "Ö&ffnen"
Warum GDI Plus das nicht erkennt da fragst du mich zu viel.

gruss

EWeiss 7. Okt 2016 19:01

AW: StringReplace verursacht AV
 
Zitat:

Zitat von himitsu (Beitrag 1350153)
Delphi-Quellcode:
string(Txt)

Weg mit dem schrottigen Cast und wenn nicht, dann soll man sich auch nicht wundern, wenn man die automatische Speicherverwaltung der Strings durcheinander bringt.


Delphi-Referenz durchsuchenStripHotkey

Wird gemacht ;)

EDIT:
Ok hat sich erledigt..
Nach dem aktivieren des Combo Hook um eigene Bilder in den Button zu zeichnen habe ich das HDC Array zu klein ausgelegt.
Da kam es dann beim zeichnen des Button Text zu Problemen.

Bedingt durch die Events Probleme die bei meinem Ownerdraw FileDialog auftraten muss ich nun die ganzen Controls Original belassen und diese Hooken.
Button und der Button der Combo sind fertig der Rest kommt noch.
Hab ja sonst nix zu tun.


gruss

EWeiss 10. Okt 2016 11:22

AW: StringReplace verursacht AV
 
Kann es sein das StringReplace intern einen Fehler verursacht.
Also die Funktion selbst?

Folgendes Szenario.

Delphi-Quellcode:
CTRL_STATE = (Normal, Focus, Down, Disabled);

Delphi-Quellcode:
TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase);


CTRL_STATE = 0..3
TReplaceFlags = 0..1

Ich erstelle mir jetzt einen ImageBuffer.

Delphi-Quellcode:
  SetLength(TmpHdc, 3);
  SetLength(hBmp, 3);
  SetLength(hBmpOld, 3);

  Wnd := GetDesktopWindow;
  DC := GetWindowDC(Wnd);

  for IntI := 0 to 3 do
  begin
0..3 ist das jeweilige Bitmap im ImageStrip. (Ich hoffe ihr wist was gemeint ist.)
0 wäre dann normal
1 Focus usw..

Eigentlich korrekt.

Aber wenn ich nun das Programm starte bekomme ich in der Zeile
Delphi-Quellcode:
  Caption := StringReplace(Caption, '&', '', [rfReplaceAll]);


einen AV das seltsame ist in einer ganz anderen Unit die eigentlich nichts mit dieser zu tun hat wo der ImageBuffer erstellt wird.
Die Procedure für den Buffer ist privat deklariert in einer eigenen Classe außerhalb da wo StringReplace den Fehler verursacht.

Ändere ich nun die länge also erhöhe sie mit 1
Delphi-Quellcode:
SetLength(TmpHdc, 4);
SetLength(hBmp, 4);
SetLength(hBmpOld, 4);
Ist das Problem verschwunden.. Warum?
Was hat StringReplace mit der Dimension meines Array zu tun das eigentlich korrekt sein sollte.
Ich habe ja keine 5 sondern nur 4 Bilder aneinanderhängend im ImageStrip.
also 0..3

Also! Was hat StringReplace mit der Dimension meines Array zu tun? Das auch noch Privat in einer ganz anderen Classe definiert ist.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:29 Uhr.
Seite 1 von 4  1 23     Letzte »    

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