[gelöst] Stringgrid Textcodierung ändert sich
-
- Beiträge: 174
- Registriert: Do 3. Mär 2011, 21:34
- OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
- CPU-Target: Intel 32/64Bit, ARM9
- Wohnort: Ulm
[gelöst] Stringgrid Textcodierung ändert sich
Hallo zusammen,
ich versuche mich gerade an Stringgrids. Viel komplexer als ich am Anfang vermutet hätte.
Ich hab schon einiges im Netz dazu gefunden, bin aber noch nicht so ganz durchgestiegen.
Erster Punkt wäre "TForm1.StringGrid1DrawCell". Das stellt ja ein Ereignis dar.
Aber auf was hin wird den das Ereignis eigentlich ausgelöst?
Bei Programmversuchen landete ich da relativ schnell in einer Endlosschleife und schnalls aber nicht warum eigentlich.
Zeiter Punkt.
Ich hab aus dem Netz Beispiele gefunden mit denen ich bestimmte Zellen des Grids anders einfärben kann.
Das tut auch entsprechend. Nur ändert sich bei mir irgendwie die Zeichenkodierung und ich kriegs nicht richtig hin.
Ablauf in diesen Beispielen:
(über DrawCell)
Den Celltext in einen String speichern,
Celle einfärben,
mittels DrawText.. den gespeicherten Text neu schreiben.
Wenn jetzt ein Umlaut wie "Länge" mit in der Zelle stand, steht danach statt dem ä nur Müll drin.
Wo liegt denn da das Problem oder noch besser, wie kann ich das Lösen.
Ich danke euch schon mal im Vorraus für die Hilfe
Gruß
NoCee
ich versuche mich gerade an Stringgrids. Viel komplexer als ich am Anfang vermutet hätte.
Ich hab schon einiges im Netz dazu gefunden, bin aber noch nicht so ganz durchgestiegen.
Erster Punkt wäre "TForm1.StringGrid1DrawCell". Das stellt ja ein Ereignis dar.
Aber auf was hin wird den das Ereignis eigentlich ausgelöst?
Bei Programmversuchen landete ich da relativ schnell in einer Endlosschleife und schnalls aber nicht warum eigentlich.
Zeiter Punkt.
Ich hab aus dem Netz Beispiele gefunden mit denen ich bestimmte Zellen des Grids anders einfärben kann.
Das tut auch entsprechend. Nur ändert sich bei mir irgendwie die Zeichenkodierung und ich kriegs nicht richtig hin.
Ablauf in diesen Beispielen:
(über DrawCell)
Den Celltext in einen String speichern,
Celle einfärben,
mittels DrawText.. den gespeicherten Text neu schreiben.
Wenn jetzt ein Umlaut wie "Länge" mit in der Zelle stand, steht danach statt dem ä nur Müll drin.
Wo liegt denn da das Problem oder noch besser, wie kann ich das Lösen.
Ich danke euch schon mal im Vorraus für die Hilfe
Gruß
NoCee
Zuletzt geändert von NoCee am Fr 28. Jun 2013, 16:38, insgesamt 1-mal geändert.
Re: Stringgrid Textcodierung ändert sich
Zu Endlosschleife und Kodierung kann man nicht viel sagen, wenn man deinen Code nicht sieht.
-
- Beiträge: 565
- Registriert: So 26. Aug 2012, 09:03
- OS, Lazarus, FPC: Windows(10), Linux(Arch)
- CPU-Target: 64Bit
Re: Stringgrid Textcodierung ändert sich
zu deiner Endlosschleife...
ich vermute mal, dass du bei dem ereignis DrawCell deiner Tabelle Code ausführst, der ein neuzeichnen der Tabelle erforderlich macht.
bei einem Repaint der TStringgrid wird nähmlich der reihe nach für jede zelle das DrawCell ereignis aufgerufen... das hat zur folge, dass sich die Tabelle am laufenden bande neuzeichnet...(durchsuch deinen Code mal nach stellen wo du den Text in einer Zelle veränderst).
MFG
Komoluna
ich vermute mal, dass du bei dem ereignis DrawCell deiner Tabelle Code ausführst, der ein neuzeichnen der Tabelle erforderlich macht.
bei einem Repaint der TStringgrid wird nähmlich der reihe nach für jede zelle das DrawCell ereignis aufgerufen... das hat zur folge, dass sich die Tabelle am laufenden bande neuzeichnet...(durchsuch deinen Code mal nach stellen wo du den Text in einer Zelle veränderst).
MFG
Komoluna
Programmer: A device to convert coffee into software.
Rekursion: siehe Rekursion.
Rekursion: siehe Rekursion.
-
- Beiträge: 174
- Registriert: Do 3. Mär 2011, 21:34
- OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
- CPU-Target: Intel 32/64Bit, ARM9
- Wohnort: Ulm
Re: Stringgrid Textcodierung ändert sich
Aaaja,
danke für die Erleuchtung.
Wenn ich das jetzt richtig verstanden habe, wird das Ereignis Drawcell aufgerufen wenn ich z.B. einen Text einer Celle ändere
wie etwa Stringgrid1.Cells[2, 1] := 'Das ist ein Text' ; Also ruft irgendwas ein Drawcell auf wenn ein Neuzeichnen nötig wird.
Dann ist mir mein Problem mit der Endlosschleife klar. Ich mach bisher teilweise in Drawcell eine Änderung an der Zelle
dadurch wird dann wiederung Drawcell aufgerufen => also endlos.
Fehlt mir noch mein zweiter Punkt.
Stringgrid1.Cells[2, 1] := 'Das ist ein Text mit Öös' ; die Öös werden bei mir falsch dargestellt.
Mir ist schon klar, das das was mit der Codierung Ansii, Widestring, UTF und was weis ich noch alles zu tun hat.
Ich kriegs halt leider nicht hin. Im Netz finde ich da auch überhaupt nix erlösendes dazu.
Gruß
NoCee
danke für die Erleuchtung.
Wenn ich das jetzt richtig verstanden habe, wird das Ereignis Drawcell aufgerufen wenn ich z.B. einen Text einer Celle ändere
wie etwa Stringgrid1.Cells[2, 1] := 'Das ist ein Text' ; Also ruft irgendwas ein Drawcell auf wenn ein Neuzeichnen nötig wird.
Dann ist mir mein Problem mit der Endlosschleife klar. Ich mach bisher teilweise in Drawcell eine Änderung an der Zelle
dadurch wird dann wiederung Drawcell aufgerufen => also endlos.
Fehlt mir noch mein zweiter Punkt.
Stringgrid1.Cells[2, 1] := 'Das ist ein Text mit Öös' ; die Öös werden bei mir falsch dargestellt.
Mir ist schon klar, das das was mit der Codierung Ansii, Widestring, UTF und was weis ich noch alles zu tun hat.
Ich kriegs halt leider nicht hin. Im Netz finde ich da auch überhaupt nix erlösendes dazu.
Gruß
NoCee
-
- Beiträge: 174
- Registriert: Do 3. Mär 2011, 21:34
- OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
- CPU-Target: Intel 32/64Bit, ARM9
- Wohnort: Ulm
Re: Stringgrid Textcodierung ändert sich
Nachtrag
Habs geschafft.
Ich hab versuchshalber alles mögliche versucht hin und her umzucodieren ansitoutf8, utf8to... u.a.
(reines try and error)
Folgendes hat dann doch geholfen:
im Drawcell...
celltext := utf8toansi(Cells[ACol, ARow]); // Celltext sichern
Cellen einfärben
DrawText(Canvas.Handle, Pchar(celltext), Length(celltext), aRect, DT_Center); // Text in Zelle zurückschreiben
Ob das der Weisheit letzter Schluß ist wies ich nicht, aber funktionieren tuts mal wie ichs brauche.
Vielleicht kann mir ja einer erklären warum das so ist.
Gruß und ein schönes Wochenende
wenns auch mit dem Wetter wieder mal nicht so klappt
NoCee
Habs geschafft.

Ich hab versuchshalber alles mögliche versucht hin und her umzucodieren ansitoutf8, utf8to... u.a.
(reines try and error)
Folgendes hat dann doch geholfen:
im Drawcell...
celltext := utf8toansi(Cells[ACol, ARow]); // Celltext sichern
Cellen einfärben
DrawText(Canvas.Handle, Pchar(celltext), Length(celltext), aRect, DT_Center); // Text in Zelle zurückschreiben
Ob das der Weisheit letzter Schluß ist wies ich nicht, aber funktionieren tuts mal wie ichs brauche.
Vielleicht kann mir ja einer erklären warum das so ist.
Gruß und ein schönes Wochenende
wenns auch mit dem Wetter wieder mal nicht so klappt
NoCee
Re: [gelöst] Stringgrid Textcodierung ändert sich
Wäre alles nicht nötig, wenn du statt der Winapi Funktion DrawText die LCL Funktion Canvas.TextRect verwenden würdest.NoCee hat geschrieben: DrawText(Canvas.Handle, Pchar(celltext), Length(celltext), aRect, DT_Center); // Text in Zelle zurückschreiben
http://lazarus-ccr.sourceforge.net/docs ... trect.html
-
- Beiträge: 52
- Registriert: Mi 15. Mai 2013, 21:21
- OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
- CPU-Target: 32Bit
Re: [gelöst] Stringgrid Textcodierung ändert sich
Das hatte ich vor kurzem mal gemacht, hier ist ein Beispiel:theo hat geschrieben:Wäre alles nicht nötig, wenn du statt der Winapi Funktion DrawText die LCL Funktion Canvas.TextRect verwenden würdest.NoCee hat geschrieben: DrawText(Canvas.Handle, Pchar(celltext), Length(celltext), aRect, DT_Center); // Text in Zelle zurückschreiben
http://lazarus-ccr.sourceforge.net/docs ... trect.html
Code: Alles auswählen
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
aRect: TRect; aState: TGridDrawState);
var
ZeilenText: string;
MyTxtStyle: TTextStyle;
begin
with StringGrid1 do
begin
//....
ZeilenText := Cells[ACol, ARow]; // Text der Zelle holen
//Text zentriert zeichnen
MyTxtStyle.Alignment := taCenter;
MyTxtStyle.Layout := tlCenter;
Canvas.TextRect(aRect,aRect.Left, aRect.Top, ZeilenText,MyTxtStyle);
end;
end;
Code: Alles auswählen
procedure TForm1.StringGrid1PrepareCanvas(sender: TObject; aCol, aRow: Integer;
aState: TGridDrawState); //-> OnPrepareCanvas
var
MyTxtStyle: TTextStyle;
begin
with StringGrid1 do
begin
//...
MyTxtStyle.Alignment:= taCenter;
MyTxtStyle.Layout:= tlCenter;
Canvas.TextStyle:= MyTxtStyle;
end;
end;