Autor |
Beitrag |
sunday_2
      
Beiträge: 101
Delphi 7.0
|
Verfasst: Di 12.11.02 11:35
Hi,
ich habe ein Problem mit dem StringGrid. Ich möchte ein StrinGrid mit 9 Zeilen und 23 Spalten erstellen. Der User soll mit der Maus über dieses StringGrid beliebige Felder makieren. Auf druck der Enter-Taste sollen nun diese makierten Felder farbig erscheinen und ein zugewiesener Buchstabe mittig in den Feldern stehen. (Sprich Zeile 3-5 in Spalte 17-20 wurden makiert, haben nach druck der Enter-Taste einen Rahmen sind Rot und mittig steht ein "A". Nun mussen alle roten Felder auf A reagieren.) Wenn ich nun andere Felder makiere und dann die Enter-Taste drücke sollen diese eine andere Farbe bekommen und den Buchstaben B. Die Felder von A müssen natürlich sichtbar bleiben.
Ich habe zwar schon kleinere Teilerfolge erzielt, glaube aber das ich damit nicht wirklich weiter komme.
(12.11.02 12:17 Tino) Titel geändert & Topic verschoben.
_________________ Gruß Sunday
... wer nicht fragt, bleibt dumm!!!
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Di 12.11.02 12:15
Hi.
Nun, wenn du uns ein konkretes Problem nennen könntest, könnten wir auch etwas besser helfen. So bleibt es nur bei allgemeinen Tips.
Hier kommt einer:
Ich empfehle dir, sowas besser in einem Array abzubilden, sodaß du auch ohne Steuerelement mit den Daten arbeiten kannst.
PS: Der Titel ist nicht gerade aussagekräftig (siehe Forum-Regeln)...
Cu,
Udontknow
|
|
Hagbard Celine
      
Beiträge: 119
|
Verfasst: Di 12.11.02 13:00
Je nachdem was Du damit vor hast kann ich dir die TMS Komponenten empfehlen! Kosten zwar ein wenig Geld(Es gibt auch freie mit tms-Werbetext!) Aber Du kannst gerade mit der StringGrid Komponente unheimlich viel machen.
|
|
sunday_2 
      
Beiträge: 101
Delphi 7.0
|
Verfasst: Di 12.11.02 13:07
Mein Problem ist, das ich nicht weiß wie ich die Prozedure schreibe, das er das oben geschriebene durchführt. Bisher bin ich soweit, das ich mit OnMouseDown und OnMouseUp errechnet habe, welche Felder makiert wurden.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TSpieldefinition.sg_torfelddefinition_torfeldMouseDown( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin StartX := X; StartY := Y; end;
procedure TSpieldefinition.sg_torfelddefinition_torfeldMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin torfeld_startX.Caption := IntToStr(StartX); torfeld_startY.Caption := IntToStr(StartY); torfeld_endX.Caption := IntToStr(X); torfeld_endY.Caption := IntToStr(Y); end; |
Diese Werte habe ich dann auf ein OnKeyPress weiterbearbeitet.
Ein Feld im StringGrid ist übrigens 30 *30 die Trennlienien 1 Pixel groß.
In Tormatrix versuche ich die Daten zu Speichern.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| procedure TSpieldefinition.sg_torfelddefinition_torfeldKeyPress( Sender: TObject; var Key: Char); var feldstartX, feldstartY, feldendeX, feldendeY: integer; tormatrix : array [1..23]of array [1..9] of string; a, b, c, d, X, Y : integer; begin //Mousewerte umrechnen in Feldangaben feldstartX := StrToInt(torfeld_startX.Caption); feldstartX := (feldstartX - (feldstartX mod 31)) div 31; feldstartY := StrToInt(torfeld_startY.Caption); feldstartY := (feldstartY - (feldstartY mod 31)) div 31; feldendeX := StrToInt(torfeld_endX.Caption); feldendeX := (feldendeX - (feldendeX mod 31)) div 31; feldendeY := StrToInt(torfeld_endY.Caption); feldendeY := (feldendeY - (feldendeY mod 31)) div 31; //Prüffelder können später gelöscht werden label11.Caption := 'Start: '+IntToStr(feldstartX)+', '+ IntToStr(feldStartY)+'Ende: '+IntToStr(feldendeX)+', '+IntToStr(feldendeY); //Berechnung der größeren Werte if feldstartX < feldendeX then begin a := feldstartX; b := feldendeX; end else begin a := feldendeX; b := feldstartX; end; if feldstartY < feldendeY then begin c:= feldstartY; d:= feldendeY; end else begin c:= feldendeY; d:= feldstartY; end; //Prüffelder können später gelöscht werden label12.Caption := IntToStr(a)+' , '+IntToStr(c)+', '+IntToStr(b)+' , '+IntToStr(d); //Array füllen. Array hat größe des Tores if a = 0 then a := 1; if c = 0 then c := 1; for X := a to b do for Y := c to d do begin tormatrix[X][Y] := 'A'; //muß noch durch Variable ersetzt werden. //sg_torfelddefinition_torfeld.Cells[x,y]:=tormatrix[X][Y]; end; sg_torfelddefinition_torfeld.Canvas.brush.Color := $00ff3344; sg_torfelddefinition_torfeld.Canvas.FillRect(Rect(a*31, c*31,b*31,d*31)); end; |
Wenn ich das Programm ausführe sind die farbigen Felder beim zweiten OnKeyPress wieder weg(zumindest meistens. Gehe ich nach rechts über den Rand des Stringgrids raus, schmiert das Programm ab(bei allen anderen Richtungen nicht.
So langsam weis ich nicht mehr weiter.
Übrigens wichtig ist nur, das ich die Kriterien von oben erfülle. Wenn das auch anders geht. ist das auch in Ordnung (mit Panel und Buttons oder so). Bin für jeden Tip dankbar.
_________________ Gruß Sunday
... wer nicht fragt, bleibt dumm!!!
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Di 12.11.02 14:04
Hi
Hier ist mal ein kleines Beispiel von mir. Es verwendet ein DrawGrid (du kannst auch ein Stringgrid verwenden). Für das Gitter muss die Eigenschaft goRangeSelect True und goEditing False sein. Das Gitter hat 10 Zeilen und 10 Spalten.
Dazu passend gibt es ein Array in dem die Daten zur Darstellung im Gitter abgelegt werden.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids; type TGridDaten = record Color : Tcolor; Text : string; end;
type TForm1 = class(TForm) grd: TDrawGrid; procedure FormCreate(Sender: TObject); procedure grdDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure grdKeyPress(Sender: TObject; var Key: Char); private { Private-Deklarationen } public { Public-Deklarationen } end;
var Form1: TForm1; gd : Array[0..9, 0..9] of TGridDaten; implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); var i, j : integer; begin //Arraydaten initialisieren for i := 0 to 9 do for j := 0 to 9 do begin gd[i, j].Color := clWhite; gd[i, j].Text := ''; end; end;
procedure TForm1.grdDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin with grd.Canvas do begin if State = [] then Brush.Color := gd[ACol, ARow].Color; TextRect(Rect, Rect.Left, Rect.Top, gd[ACol, ARow].Text); end; end;
procedure TForm1.grdKeyPress(Sender: TObject; var Key: Char); var i, j : integer; begin with grd.Selection do begin if (Right - Left >= 0) and (Bottom - Top >= 0) then begin for i := Left to Right do for j := Top to Bottom do begin gd[i, j].Color := clRed; gd[i, j].text := Key; end; grd.Repaint; end; end; end;
end. |
Wenn du Zellen markierst und dann eine Taste drückst, werden die markierten Zellen rot dargestellt und der gedrückte Buchstabe in die Zellen geschrieben.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
sunday_2 
      
Beiträge: 101
Delphi 7.0
|
Verfasst: Di 12.11.02 17:34
Juhuu, jetzt bin ich wieder in der Spur!!!
Danke Lothar
_________________ Gruß Sunday
... wer nicht fragt, bleibt dumm!!!
|
|
|