Discussion:
StringGrid: Zelle nach Doppelklick färben
(zu alt für eine Antwort)
Jasmin Bajric
2005-06-29 11:42:56 UTC
Permalink
Hallo Gemeinde,

ich steh' gerade mal wieder auf dem Schlauch:
Wenn der User einen Doppelklick auf eine Zelle in einem StringGrid mach,
soll er mittels eines ColorDialog nach der gewünschten Farbe gefragt werden
und anschließend soll die Zelle auf der geklickt worden ist, mit der
gewählten Frabe eingefärbt werden.
Irgendwie bekomme ich das DblClick mit dem DrawCell und dem ColorDialog
nicht recht verheiratet. Hat da jemand einen Tipp oder eine Idee?

Vielen Dank & Gruss
Jasmin
Joachim Pimiskern
2005-06-29 14:02:47 UTC
Permalink
Hallo,
Post by Jasmin Bajric
Irgendwie bekomme ich das DblClick mit dem DrawCell und dem
ColorDialog nicht recht verheiratet.
die Eventbehandlung für den Doppelklick bei StringGrid ist
dürftig. In einem Projekt hab ich das so gemacht:

TOnCellDblClick = procedure(Sender: TComponent; ACol, ARow: integer)
of object;

TUnarchStringGrid = class(TStringGrid)
private
protected
FOnCellDblClick: TOnCellDblClick;
procedure WMLButtonDblClk(var M: TWMLButtonDblClk); message
WM_LBUTTONDBLCLK;
public
...
published
property OnCellDblClick: TOnCellDblClick read FOnCellDblClick write
FOnCellDblClick default nil;
end;

...

procedure TUnarchStringGrid.WMLButtonDblClk(var M: TWMLButtonDblClk);
var acol,arow: longint;
begin
MouseToCell(M.Xpos,m.YPos, ACol, ARow);
if (assigned(FOnCellDblClick)) then
FOnCellDblClick(self,ACol,ARow);
end;

procedure Register;
begin
...
end;

Grüße,
Joachim
Michael Geisler
2005-07-01 10:28:14 UTC
Permalink
Post by Jasmin Bajric
Irgendwie bekomme ich das DblClick mit dem DrawCell und dem
ColorDialog nicht recht verheiratet. Hat da jemand einen Tipp oder
eine Idee?
nicht getestet, aber so sollte es geht.



procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow:
Integer;
Rect: TRect; State: TGridDrawState);
begin
StringGrid1.Canvas.Brush.Color := Integer(StringGrid1.Objects[ACol,
ARow]);
end;

procedure TForm1.StringGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

var
ACol, ARow : Integer;

begin
if ssDouble in Shift then
begin
StringGrid1.MouseToCell(x,y,ACol,ARow);
if Colordialog.Execute then
StringGrid1.Objects[ACol, ARow] := TObject(ColorDialog.Color)
end;
end;


Gruss
micha
Marian Aldenhövel
2005-07-01 11:35:16 UTC
Permalink
Hi,
Post by Jasmin Bajric
Wenn der User einen Doppelklick auf eine Zelle in einem StringGrid mach,
soll er mittels eines ColorDialog nach der gewünschten Farbe gefragt werden
und anschließend soll die Zelle auf der geklickt worden ist, mit der
gewählten Frabe eingefärbt werden.
Also brauchst Du zunächst mal einen Platz an dem Du die gewählte Farbe
speichern kannst. Nehmen wir der Einfachheit halber das Objects[][]-Array
des Grids, in einem richtigen Programm wirst Du vielleicht noch mehr
Daten unterbringen wollen, dann würde man anders vorgehen.

procedure TForm1.StringGrid1DblClick(Sender:TObject);
var C:TColor;
begin
with Sender as TStringGrid do
begin
// Aktuelle Farbe bestimmen
if Objects[Col,Row]=NIL
then C:=Color
else C:=TColor(Objects[Col,Row]);
ColorDialog1.Color:=C;

// Dialog ausführen
if ColorDialog1.Execute then
begin
// Farbe setzen
Objects[Col,Row]:=pointer(ColorDialog1.Color);
// Malen bestellen
Invalidate;
end;
end;
end;

Und in OnDrawCell liest Du wieder die Farbe wie oben und malst dann
entsprechend.

Wesentlich ist, daß es keinen harten Zusammenhang zwischen der Ausführung des
Dialogs und dem Malen gibt, ein Windowssteuerlement muss jederzeit in der Lage
sein sich selbst zu malen. Deshalb machst Du einerseits eine Einstellung wie
gemalt werden soll und malst andererseits wenn es Zeit dazu ist.

Ciao, MM
--
Marian Aldenhövel, Rosenhain 23, 53123 Bonn. +49 228 624013.
http://www.marian-aldenhoevel.de
"It's easy to make a small fortune in aviation,
provided you start with a big one"
Jasmin Bajric
2005-07-04 06:28:07 UTC
Permalink
Prima, vielen Dank für eure Ideen!

Gruss
Jasmin

Loading...