[gelöst] Stringgrid Textcodierung ändert sich

Rund um die LCL und andere Komponenten
Antworten
NoCee
Beiträge: 170
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

Beitrag von NoCee »

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
Zuletzt geändert von NoCee am Fr 28. Jun 2013, 16:38, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Stringgrid Textcodierung ändert sich

Beitrag von theo »

Zu Endlosschleife und Kodierung kann man nicht viel sagen, wenn man deinen Code nicht sieht.

Komoluna
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

Beitrag von Komoluna »

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
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

NoCee
Beiträge: 170
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

Beitrag von NoCee »

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

NoCee
Beiträge: 170
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

Beitrag von NoCee »

Nachtrag
Habs geschafft. :D
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

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: [gelöst] Stringgrid Textcodierung ändert sich

Beitrag von theo »

NoCee hat geschrieben: DrawText(Canvas.Handle, Pchar(celltext), Length(celltext), aRect, DT_Center); // Text in Zelle zurückschreiben


Wäre alles nicht nötig, wenn du statt der Winapi Funktion DrawText die LCL Funktion Canvas.TextRect verwenden würdest.

http://lazarus-ccr.sourceforge.net/docs ... trect.html

DonMigos
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

Beitrag von DonMigos »

theo hat geschrieben:
NoCee hat geschrieben: DrawText(Canvas.Handle, Pchar(celltext), Length(celltext), aRect, DT_Center); // Text in Zelle zurückschreiben


Wäre alles nicht nötig, wenn du statt der Winapi Funktion DrawText die LCL Funktion Canvas.TextRect verwenden würdest.

http://lazarus-ccr.sourceforge.net/docs ... trect.html


Das hatte ich vor kurzem mal gemacht, hier ist ein Beispiel:

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


Oder so (macht bei mir insgesamt weniger probleme, wenns um Farben geht):

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;


Mfg

Antworten