Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TStringGrid (https://www.delphipraxis.net/207570-tstringgrid.html)

Willie1 9. Apr 2021 17:06

TStringGrid
 
Hallo Leute,
auf einem Fenster gibt es nur ein StringGrid und einen Button zum Schließen des Fensters. Der Focus liegt auf dem StringGrid.
Wenn ich mit [Tab] auf dn Button wechsle und dann das Mausrad über dem StringGrid drehe, kommt die Fehlermeldung "Gitterindex außerhalb des gültigen Bereichs". Wie kann ich das verhindern?
Gruß Willie.

Ich sehe gerade, hier gibt es viele offene Fragen.

Willie1 12. Apr 2021 16:15

AW: TStringGrid
 
Hallo Freunde*innen,
ich habe diesen Thread von 2003 mit Nachfrage 2013 gefunden: https://www.delphipraxis.net/10733-s...-bereichs.html. Als Lösung kam nur selber zeichnen. Kann es sein, dass dieses Problem(chen) seit 2003 nicht gelöst wurde?
Gruß Willie.

himitsu 12. Apr 2021 16:23

AW: TStringGrid
 
Pratisch wurde seit Jahrzehnten an diesen Grids nicht mehr gemacht.

Nur im FMX gibt es ein neues Grid.
Ansonsten nutzt eigentlich "niemand" diese grauenhafte Komponente und verwendet "ordentliche" Alternativen.
> VirtualStringTree oder Grids gewisser anderer Hersteller.

Ja, es ist schon ein gewisses Armmutszeugnis, dass eine eigentlich auf Datenbanken ausgelegte Sprache (seit sie Delphi heißt, wegen Oracle :zwinker:) keine halbwegs brauchbare Gridkomponente besitzt/besaß.


Du darfst den Fehler gern im Bugtracker melden, aber Hoffnungen ... naja.

Delphi.Narium 12. Apr 2021 16:45

AW: TStringGrid
 
Der Fehler kommt aus
Delphi-Quellcode:
procedure TCustomGrid.MoveCurrent(ACol, ARow: Longint; MoveAnchor,
  Show: Boolean);
wenn diese Bedingung erfüllt ist:
Delphi-Quellcode:
  if (ACol < 0) or (ARow < 0) or (ACol >= ColCount) or (ARow >= RowCount) then
    InvalidOp(SIndexOutOfRange);
Sprich: Der Fehler tritt auf, wenn (aus welchem Grund auch immer) eine Zelle im Grid ausgewählt wird, die das Grid nicht enthält.

Beim Drehen des Mausrades wird halt immer weiter in den Zeilen nach oben oder unten gescrollt. Leider wird dabei vergessen auf das Ende des Grids zu achten und damit aus dem Grid rausgescrollt, anstatt dann mit dem Scrollen aufzuhören, wenn die erste bzw. die letzte Zeile im Grid erreicht ist.

Man könnte halt einfach mal aus dem
Delphi-Quellcode:
  if (ACol < 0) or (ARow < 0) or (ACol >= ColCount) or (ARow >= RowCount) then
    InvalidOp(SIndexOutOfRange);
ein
Delphi-Quellcode:
  if (ACol < 0) or (ARow < 0) or (ACol >= ColCount) or (ARow >= RowCount) then
    exit;
machen ;-)

Willie1 12. Apr 2021 18:28

AW: TStringGrid
 
Ich habe mir StringGrid nochmal genau angesehen.
Zitat:

Beim Drehen des Mausrades wird halt immer weiter in den Zeilen nach oben oder unten gescrollt. Leider wird dabei vergessen auf das Ende des Grids zu achten und damit aus dem Grid rausgescrollt, anstatt dann mit dem Scrollen aufzuhören, wenn die erste bzw. die letzte Zeile im Grid erreicht ist.
Nein, daran liegt es nicht. Wenn das StrGr mit Mausklick oder SetFocus den Fokus hat, wird ein Rahmen um ein Feld gelegt = selektiert. Dann lässt sich mit dem Mausrad oder Pfeltasten/Blättern scrollen oder blättern ohne Problem auch bis zum Ende und wieder zum Anfang zurück.
Delphi-Quellcode:
procedure TSpitzeForm.SpitzeTabExit(Sender: TObject);
var
  MyRect: TGridRect;
begin
  MyRect.Left:=-1;      // Löscht das selektierte Feld in der Tabelle
  MyRect.Top:=-1;
  MyRect.Right:=-1;
  MyRect.Bottom:=-1;
  TStringGrid(Sender).Selection:=MyRect
end; //dieser Tipp aus einer Tippsammlung ist unvollständig geprüft worden!
Wenn man diese Routine einfügt und dann das StrGr verlässt und jetzt das Mausrad über dem StrGr dreht, löst das den beschriebenen Fehler aus. Falls man die Routine weglässt, wird das Feld beim Verlassen des StrGr blau eingefärbt aber der Fehler tritt nicht auf!
Es bleibt also die Wahl, entweder die Blaufärbung des Feldes hin zu nehmen oder die Fehlermeldung zu provozieren. Blöd gemacht.

Himitsu, ich bin der "Niemand", der ganz gerne StrGr benutzt und finde diese Komponente nicht so schlecht aber ich bin auch nur Hobby-Programmierer. StrGr ist tatsächlich seit Delphi 3 unverändert.

Delphi.Narium 12. Apr 2021 19:57

AW: TStringGrid
 
Du beschreibst, dass der Fehler nicht auftritt, wenn Du Dich im StringGrid befindest und im StringGrid navigierst.

Deine ursprüngliche Fehlerbeschreibung besagte aber, dass, wenn Du das StringGrid verlässt und dann außerhalb des StringGrids das Mausrad betätigst, der Fehler auftritt.

Die Fehlermeldung lautet da: "Gitterindex außerhalb des gültigen Bereichs"

Dann suche doch bitte diese Fehlermeldung in den Sourcen Deines Delphis.

Bei meinem Delphi 7 ist sie in der Consts.pas der VCL zu finden.

Der Text ist der Konstanten SIndexOutOfRange zugewiesen.

Und nun suche bitte diese Konstante in den Delphiquellen zum StringGrid. Und wo landest Du nun?

Und die Begründung: Wenn ich im StringGrid mit Fokus auf im StringGrid navigiere und es passiert dann kein Fehler, kann auch kein Fehler passieren, wenn das StringGrid keinen Fokus hat und man dann quasi von außerhalb des StringGrids im StringGrid navigiert (was nunmal beim Scrollen per Mausrad passiert, wenn es sich über dem StringGrid befindet), ist etwas zu kurz gegriffen.

Mach Dir 'ne Sicherungskopie der Grids.pas und ändere die von mir oben beschrieben Stelle (z. B. durch einfügen eines Fehlerdialoges) und schau, ob Du den zu sehen bekommt.

Ansonsten einfach mal mit Debug-Dcus kompilieren und im Debugger schauen, wo denn der Fehler ausgelöst wird. Dann wirst Du sehen, ob das die Ursache sein kann oder eben auch nicht.

Oder 'nen eigenen Nachfahren des StringGrids machen und dort nur die Methode MoveCurrent überschreiben, so dass vor dem Aufruf der eigentlichen Methode, der Fehler bereits abgefangen wird.

Z. B. sowas?
Delphi-Quellcode:
procedure TEigenesGustomGrid.MoveCurrent(ACol, ARow: Longint; MoveAnchor, Show: Boolean);
begin
  if not ((ACol < 0) or (ARow < 0) or (ACol >= ColCount) or (ARow >= RowCount)) then inherited;
end;

KodeZwerg 12. Apr 2021 21:46

AW: TStringGrid
 
Naja, wenn man OutOfBounds werte eingibt, landet man auch out of bound.

Wie wäre es hiermit?
Delphi-Quellcode:
procedure TForm7.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  Farbe: TColor;
begin
  Farbe := clWhite;
  if (gdSelected in State) then
  begin
    TStringGrid(Sender).Canvas.Brush.Color := Farbe;
    TStringGrid(Sender).Canvas.FillRect(Rect);
  end;
end;

Willie1 13. Apr 2021 17:41

AW: TStringGrid
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hallo,
das ist so richtig ein Thema für einen Freak wie mich.:lol:
Also: das ganze liegt nur an dem blöden Tipp StrGrOnExit s.o., er stammt aus dem an sich guten Delphi-Buch von Doberenz und Kowalski.
Wenn man dieses Event weglässt, ist alles in Ordnung. Ihr müsst euch nur damit abfinden, dass das selektierte Feld sich blau einfärbt, wenn der Fokus gewechselt wird. Falls goDrawFocusSelected = true, bleibt das ausgewählte Feld immer blau. Das ist alles!!!

Im Anhang Bilder, die das zeigen. Willie.

Screenshot-1 StrGr hat den Focus, alles Ok.
-2 hat nicht den Fokus, es gibt den Fehler. (Fehler durch OnExit verursacht)
-3 nicht den Focus, alles Ok.

KodeZwerg 13. Apr 2021 18:09

AW: TStringGrid
 
Zitat:

Zitat von Willie1 (Beitrag 1487073)
Ihr müsst euch nur damit abfinden, dass das selektierte Feld sich blau einfärbt, wenn der Fokus gewechselt wird. Falls goDrawFocusSelected = true, bleibt das ausgewählte Feld immer blau.

wenn du es mit meinem event machst nicht.

viele grüße und bleib gesund.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:48 Uhr.

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