![]() |
Stringgrid selection Problem !
Hi leute,
hab ein großes Problem, nachdem ich beim coden so richtig in fahrt gekommen bin, musste ich leider feststellen,das das Stringgrid so bloede markiert, immer nur ein viereckiger bereich, ich MUSS es aber so hinkriegen, das das stringgrid so markiert wie ein Memo oder Richedit, sonst waren zweieinhalb Wochen Arbeit umsonst, und ehrlich gesagt wuerde ich das Project eher hinschmeissen als komplett von vorn anzufangen. also bitte , sagt mir man kann den markierungsmodus vom grid umschalten ich hoffe wirklich jemand kann mir weiterhelfen :pale: |
Re: Stringgrid selection Problem !
Liste der Anhänge anzeigen (Anzahl: 1)
Erst einmal die schlechte Nachricht :mrgreen:
TStringGrid kann es nicht, genauso wie auch das TDrawGrid von Delphi. Die Ursache hier liegt etwas tiefer begraben. Das Delphi-Grid merkt sich ausschließlich das markierte Rechteck in der Eigenschaft Selection
Delphi-Quellcode:
Daran lässt sich auch erkennen, daß sich dieses nicht ohne weiteres umgehen lässt. Nun gibt es zwei grundlegende Möglichkeiten. Die erste wäre die Nutzung einer anderen Komponente, was schnell zu Problemen führen kann, die zweite ist es, das Verhalten des StringGrids etwas abzuändern :-)
type
TGridRect = record case Integer of 0: (Left, Top, Right, Bottom: Longint); 1: (TopLeft, BottomRight: TGridCoord); end; TCustomGrid = class(TCustomControl) ... property Selection: TGridRect read GetSelection write SetSelection; ... end; Anbei mal ein ScreenShot des geänderten StringGrid. Nachteilig an dieser Lösung ist, daß das Normale Verhalten des StringGrid (auswahl über Maus, Shift+Cursor) nicht mehr geht, außer Du nimmst Dich dieses Problemes an und änderst das auch noch - mir fehlt jetzt die Zeit. Mehr in ein paar Minuten. ...:cat:... |
Re: Stringgrid selection Problem !
So, die Lösung habe ich gleich in die CodeLib befördert. Hier:
![]() Viel Erfolg. Wenn Du Fragen hast, bitte in Deinem (diesen!) Thread. Danke. ...:cat:... |
Re: Stringgrid selection Problem !
hallo sakura,
habe mir dein screenshot angesehen, und ich glaube du hast mich falsch verstanden, (oder ich verstehen dein screeshot falsch). ich will keine multiselectionen haben, ich will nur, das wenn ich in die mitte einer zeile mit der makierung anfange, und z.b. eine zeile runter gehe, die markierung wieder bis zur mitte der zeile geht ->> kein rechteckiger bereich was ich bei dir gesehen hab, waren doch multiselectierte bereiche oder ?? |
Re: Stringgrid selection Problem !
Zitat:
...:cat:... |
Re: Stringgrid selection Problem !
Liste der Anhänge anzeigen (Anzahl: 1)
hi sakura,
also ich hab mal ein screenshot beigefügt, zu sagen waere noch , das ich das grid manuell mit daten gefuettert habe, die zellen sind also nicht mit irgendeiner festgelegten datenbankstruktur verknuepft, sondern mit einem array, gibt also keinen grund, warum ich nur rechteckig markieren sollte :) zum screenshoot: stelle dir einfach vor, die buchstaben seien einzelne zellen, und ich will immer nur einen zusammenhaegenden bereich , kein multiselekt! Die hoffnung stirbt zuletzt, danke für deine hilfe :| |
Re: Stringgrid selection Problem !
Okay, verstanden und ... ;) gelöst.
Das ist schon etwas einfacher. Du mußt zwei Ereignisse abfangen. Einmal das OnSelectCell, um dem StringGrid mitzuteilen, daß sich die Auswahl grundlegend geändert hat, und einmal das OnDrawCell Ereigniss, um die Auswahl darzustellen. Außerdem habe ich noch eine Methode geschrieben, welche ermittelt, ob sich eine Zelle (Spalte, Zeile) in der erweiterten Auswahl befindet. Hier die drei Methoden und es geht.
Delphi-Quellcode:
...:cat:...
type
TForm1 = class(TForm) [...] private { Private declarations } function CellInRange(aGrid: TCustomDrawGrid; aCol, aRow: Integer): Boolean; [...] end; // testen, ob sich eine bestimmte Zelle in der erweiterten Auswahl aufhält function TForm1.CellInRange(aGrid: TCustomDrawGrid; aCol, aRow: Integer ): Boolean; begin Result := False; if aRow < aGrid.Selection.Top then Exit; if aRow = aGrid.Selection.Top then if aCol < aGrid.Selection.Left then Exit; if aRow > aGrid.Selection.Bottom then Exit; if aRow = aGrid.Selection.Bottom then if aCol > aGrid.Selection.Right then Exit; Result := True; end; // die Ereignisroutinen procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if Sender = nil then Exit; if not (Sender is TStringGrid) then Exit; with Sender as TStringGrid do begin // skip fixed columns if (ACol < FixedCols) or (ARow < FixedRows) then Exit; // select color if CellInRange(Sender as TStringGrid, ACol, ARow) then begin // selected cell Canvas.Brush.Color := clHighlight; Canvas.Font.Color := clHighlightText; end else begin // cell not selected Canvas.Brush.Color := clWindow; Canvas.Font.Color := clWindowText; end; // draw cell Canvas.TextRect(Rect, Rect.Left, Rect.Top, Cells[ACol, ARow]); end; end; procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin if Sender = nil then Exit; if not (Sender is TStringGrid) then Exit; with Sender as TStringGrid do begin Update; Invalidate; end; end; |
Re: Stringgrid selection Problem !
mahlzeit,
also dein code funktioniert bei mir nich, habs mal gerade in einem testproject getestet (neue form und nur 1 stringgrid) macht nicht das was es soll, entweder ist der code fehlerhaft, oder wir reden aneinander vorbei. es muss so sein: wenn du z. b. die markierung in der mitte von zeile 1 anfaengst , und gehst nach zeile 3. dann ist die rechte haelfte von zeile 1 markiert, die komplette zeile 2 und die linke haelfte von zeile 3 muss so sein weil eindimensionales array(werte alle hintereinander); aber stringgrid stellt zu 32 col breite dar, dann gehts weiter in naechster zeile arrayposotion berechet sich folgendermaßen: (acol)+(arow * 32) verstehst du, ich muss sozusagen wenn ich eine zeile runter gehe beim markieren, alle zellen die zwischen erster und letzter sind markieren koennen, um alle korrekten arraypositionen zu erhalten ich hoffe ich habs dir jetz richtig erklaeren koennen |
Re: Stringgrid selection Problem !
Genauso lief der Code auch bei mir. Was für eine Delphiversion hast Du denn? Hast Du das OnSelectCell Ereignis eingesetzt?
...:cat:... |
Re: Stringgrid selection Problem !
Liste der Anhänge anzeigen (Anzahl: 1)
mahlzeit,
also habs nochmal getestet. beide ereignisse sind gesetzt, onselectcell und ondrawcell wenn ich markiere, zeichet er ein rechteck von linksoben nach rechstunten. ich kann zwar wenn ich rechtsunten die maus nach links bewege zellen abwaehlen, aber das is nich das was ich brauche. er selectiert , die rows ZWISCHEN 1 markierter zeile und letzter markierter zeile nicht vollstaendig, sondern nur ab der col position, die ich hab, wenn ich die markierung beginne. ich glaub du hast mich doch nicht verstanden mach dir mal ne leere form, memo drauf, ausfuehren, bisserl text reinschreiben oder kopieren, idealerweise gleichlange zeilen, und dann guck dir mal an wie memo markiert. schicke dir auch mein testproject , was ich zum testen deines codes nutze, vielleicht hab ich ja auch einen fehler drin :( |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz