![]() |
OnRow/ColMove im StringGrid gezielt sperren...
Liste der Anhänge anzeigen (Anzahl: 1)
Ich bin auf der Suche nach einer Möglichkeit das verschieben von Zeilen und Spalten im StringGrid gezielt zu verhindern.
Ich habe ein Stringgrid, mit jeweils einer FixedRow und FixedCol, in der der Index der jewiligen Spalte/Zeile steht. Die zweite Zeile zeigt die Namen der jeweils darunter liegenden Spalte und soll editierbar sein. Gleiches gilt für die zweite Spalte, die Namen für die jeweilige Zeile trägt. Nun möchte ich gerne, daß man die Zeilen und Spalten per Maus verschieben kann.
Delphi-Quellcode:
Allerdings möchte ich verhindern, daß die zweite Spalte/Zeile verschiebbar ist. Ich habe nun schon versucht über OnMouseDown mit MouseToCell dies zu verhindern. Ebenso habe ich versucht die CanSelect Variable im OnSelectCell zu blocken. Aber die Funktionen für Spalten/Zeilenverschiebung scheinen damit nicht greifbar zu sein.
StringGrid.Options + [goRowMoving, goColMoving]
An Hand der angehängten Graphik : - die Fixed Spalten/Zeilen zeigen nur die Indices an - die hellgrauen Felder sind die Namen der jeweiligen Spalte und Zeile und sollen nicht verschiebbar sein - Felder mit hellem Hintergrund sind Daten, bei denen ich die Moving funktionen zulassen möchte Hat hier jemand eine Lösung? Jan |
Re: OnRow/ColMove im StringGrid gezielt sperren...
Moin, Moin.
Keine Lösung, aber eine Idee: Col+Row, die nicht verschiebbar sein sollen ebenfalls als fixed deklarieren und das Zeichnen des Grids komplett selbst übernehmen >> dabei natürlich nur Col/Row 0 in der Fixed-Optik darstellen; Col/Row 1 werden "normal" gezeichnet. Zusätzlich müsste dann wohl auch das Editieren von Col/Row 1 durch das Programm zur Verfügung gestellt werden - ziemlicher Aufwand, aber es sollte auf diese Art umsetzbar sein. |
Re: OnRow/ColMove im StringGrid gezielt sperren...
Das mit dem selber Zeichnen ist nicht das große Problem. Das tu ich eh schon zu einem gewissen Teil (die Row titles und Col titles, linksbündige Zahlendarstellung in den Daten und rechtsbündige Nichtzahlen...).
Mein ursprünglicher Ansatz war tatsächlich, daß ich einen Inplace-Editor verwende und je zwei Zeilen/Spalten auf fixed setze. Hab auch hier mal eine Anfrage gestellt, aber leider hat mich das auch nicht weiter gebracht ( ![]() Ich habe keine Informationen/Beispielcode gefunden, wie ich diesen Editor auf fixed Zellen einsetze...oder ich bin einfach zu dusselig. Auf jeden Fall hats nichts gebracht... Hast du vielleicht Beispiele, wie man den Inplace-Editor so einsetzen kann? Jan |
Re: OnRow/ColMove im StringGrid gezielt sperren...
Hallo
Eine Möglichkeit wäre folgende (nur für die Zeilen implementiert, analog funktioniert's beim Verschieben einer Spalte): 1. goRowMoving nur dann aktivieren, falls sich der Maus über Row > 1 befindet. 2. falls zur Row 1 verschoben wird, Operation wieder rückgängig machen.
Delphi-Quellcode:
(Ist zwar etwas unschön aber funktioniert)
// Zugriff auf protected MoveColumn, MoveRow verschaffen
type TMyGrid = class(TStringGrid) public procedure MoveColumn(FromIndex, ToIndex: Longint); procedure MoveRow(FromIndex, ToIndex: Longint); end; var Form1: TForm1; implementation {$R *.dfm} procedure TMyGrid.MoveColumn(FromIndex, ToIndex: Integer); begin inherited; end; procedure TMyGrid.MoveRow(FromIndex, ToIndex: Integer); begin inherited; end; procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var ACol, ARow: Integer; begin // goRowMoving nur dann aktivieren, falls sich der Maus über Row > 1 befindet. with Sender as TStringGrid do begin MouseToCell(X,Y, ACol, ARow); if (ARow > 1) then Options := Options + [goRowMoving, goColMoving] else Options := Options - [goRowMoving, goColMoving]; end; end; procedure TForm1.StringGrid1RowMoved(Sender: TObject; FromIndex, ToIndex: Integer); begin // falls zur Row 1 verschoben wird, Operation wieder rückgängig machen. if ToIndex = 1 then TMyGrid(StringGrid1).MoveRow(ToIndex, FromIndex); end; |
Re: OnRow/ColMove im StringGrid gezielt sperren...
Ich bin begeistert! :bounce2:
Den ersten Teil mit +/- [goRowMoving, goColMoving] hatte ich auch schon in diversen Events versucht. Damit bin ich selbstverständlich nur bis zum dem Punkt gekommen, den du natürlich auch erkannt hast. Spalten/Zeilen kann man dann immer noch in die 'verbotenen' Bereiche ziehen. Den Trick mit der extra Klasse, die solche Teile wieder zurückdreht, finde ich großartig. Selbst wäre ich da wohl eher nicht drauf gekommen... Ganz herzlichen Dank! Auch wenn es ein Provisorium ist, ist es für meine Zwecke doch komplett ausreichend. Mir ging es darum einem Projekt, welches ich gerade erweitere, einen Editor hinzuzufügen, um nachträglich Modifikationen an Datensätzen vorzunehmen. Normalerweise gehe ich davon aus, daß Leute ihre Daten überwiegend fertig haben, wenn sie das erste Mal mit meiner Software in Kontakt kommen... Jan PS: Ich denke, daß andere durchaus auch vor diesem Problem stehen könnten. Sollte man diesen Tip evtl. mit in die Code Library aufnehmen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:38 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 by Thomas Breitkreuz