AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi OnRow/ColMove im StringGrid gezielt sperren...
Thema durchsuchen
Ansicht
Themen-Optionen

OnRow/ColMove im StringGrid gezielt sperren...

Ein Thema von BoolString · begonnen am 2. Mär 2009 · letzter Beitrag vom 3. Mär 2009
Antwort Antwort
BoolString

Registriert seit: 2. Feb 2009
Ort: Varel
70 Beiträge
 
RAD-Studio 2009 Pro
 
#1

OnRow/ColMove im StringGrid gezielt sperren...

  Alt 2. Mär 2009, 11:25
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. StringGrid.Options + [goRowMoving, goColMoving] 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.

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
Miniaturansicht angehängter Grafiken
matrixeditor_147.png  
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#2

Re: OnRow/ColMove im StringGrid gezielt sperren...

  Alt 2. Mär 2009, 17:51
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.
Ralph
  Mit Zitat antworten Zitat
BoolString

Registriert seit: 2. Feb 2009
Ort: Varel
70 Beiträge
 
RAD-Studio 2009 Pro
 
#3

Re: OnRow/ColMove im StringGrid gezielt sperren...

  Alt 2. Mär 2009, 19:46
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 (DP).

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
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#4

Re: OnRow/ColMove im StringGrid gezielt sperren...

  Alt 2. Mär 2009, 23:41
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:
// 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;
(Ist zwar etwas unschön aber funktioniert)
Thomas
  Mit Zitat antworten Zitat
BoolString

Registriert seit: 2. Feb 2009
Ort: Varel
70 Beiträge
 
RAD-Studio 2009 Pro
 
#5

Re: OnRow/ColMove im StringGrid gezielt sperren...

  Alt 3. Mär 2009, 19:10
Ich bin begeistert!

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?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:23 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