Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Exception bei TStringGrid und Scrollbarfrage


Arne - Di 27.12.05 13:23
Titel: Exception bei TStringGrid und Scrollbarfrage
Moin zusammen,

neuer Tag, neues Problem ;)

Ich habe eine Instanz eines TStringGrid, fange Mausbuttonclicks (links) in das TStringGrid ab , um dann mittels TStringGrid.Selection := myTGridRect; eine Zeile zu selektieren.
Bei meinen Tests waren immer mehr Zeilen im TStringGrid, als gerade sichtbar, d.h. der vertikale Scrollbar ist sichtbar.
Selektiere ich jetzt eine Zeile und bewege das Mausrad, erhalte ich eine Exception der Klasse "EInvalidGridOperation". Wenn ich über die Up-/Down Buttons des vert. Scrollbars gehe, ist alles in Butter.

Kann da bitte jemand Licht reinbringen? Kann ich die Exception abfangen und nix tun - muß ich was tun???

Weiterhin: wie kann ich die Größe des verschiebbaren Teils des vert. Scrollbars so anpassen, daß er nicht die standardmäßige quadratische Form hat, sondern in der vertikalen Größe in Relation zu den Zeilen im TStringGrid steht. Hat TStringGrid da eine Eigenschaft/Methode? Ich find nämlich nix.

Many Thanx, Arne


Keldorn - Di 27.12.05 21:41

Hallo

zeig mal bitte deinen Code. mir siond Probleme nur bekannt, wenn du die selection bereits auf einen ungültigen Wert (z.B. -1,-1,-1,-1) setzt und dann außerhalb des Grids scrollst. das kannst du dann so umgehen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.StringGrid1MouseWheelDown(Sender: TObject; 
  Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); 
begin 
  with Sender as Tstringgrid do 
    begin 
      //obere Reihe + angezeigte Reihen darf nicht größer sein, als die Gesamtreihen      
      if TopRow+Visiblerowcount<rowcount then toprow:=toprow+1 
    end
  handled:=true; 
end

procedure TForm1.StringGrid1MouseWheelUp(Sender: TObject; 
  Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); 
begin 
  with Sender as Tstringgrid do 
    begin 
      if TopRow>fixedrows then toprow:=toprow-1 
    end
  handled:=true; 
end;


2. Frage:
http://www.swissdelphicenter.ch/de/showcode.php?id=1052
funktioniert für meine Bergriffe aber auch nicht so wirklich, da die scrollbox nicht 100% ausgedehnt wird.

Mfg Frank


Arne - Mi 28.12.05 11:49

Hallo Frank,

danke erstmal für Deine Antwort.

Der Code zum Selektieren einer TStringGrid Zeile sieht bei mir so aus (eine FixedRow):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TFormDBMain.DBMainStringGridClick(Sender: TObject);
var
  rGrid                 : TGridCoord;
  rCursorPos            : TPoint;
  rRect                 : TGridRect;

begin
  GetCursorPos(rCursorPos);
  rCursorPos := DBMainStringGrid.ScreenToClient(rCursorPos);
  rGrid := DBMainStringGrid.MouseCoord(rCursorPos.X, rCursorPos.Y);
  if (rGrid.Y > 1and (rGrid.Y < DBMainStringGrid.RowCount) then begin
    rRect.Top                   := rGrid.Y;
    rRect.Bottom                := rGrid.Y;
    rRect.Left                  := 0;
    rRect.Right                 := DBMainStringGrid.ColCount;
    DBMainStringGrid.Selection  := rRect;
  end;
end;


Wenn der vert. Scrollbar erscheint und ich das Mausrad bewege, kracht es jedesmal.
Werde mal deinen Code einbauen...

bye, Arne


Keldorn - Mi 28.12.05 12:03

Zitat:

rRect.Right := DBMainStringGrid.ColCount;

colcount ist nicht die letzte Spalte. damit setzt du die Selecttion auf einen ungültigen Bereich.


Delphi-Quelltext
1:
rRect.Right                 := DBMainStringGrid.ColCount-1;                    


ich habe es jetzt nicht probiert, aber die Umrechnerei mit den mousecursor brauchst du nicht. bei onclick ist col und row schon gesetzt und du kannst mit den Werten arebiten.

Mfg Frank


Arne - Do 29.12.05 18:43

Zitat:
colcount ist nicht die letzte Spalte. damit setzt du die Selecttion auf einen ungültigen Bereich.

Autsch.... da hast Du natürlich vollkommen Recht. Typischer Plus-Minus-Eins Fehler....
Funktioniert jetzt. Scrollbars noch nicht, aber jetzt weiß ich, wo ich in der Win32 API zu schauen habe. Dachte, es gäb da ein Property :cry: