Autor Beitrag
sunday_2
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101


Delphi 7.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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)... :wink:

Cu,
Udontknow
Hagbard Celine
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101


Delphi 7.0
BeitragVerfasst: 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.
ausblenden 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.
ausblenden volle Höhe Quelltext
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: 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.
ausblenden volle Höhe Quelltext
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101


Delphi 7.0
BeitragVerfasst: Di 12.11.02 17:34 
Juhuu, jetzt bin ich wieder in der Spur!!! :lol:

Danke Lothar

_________________
Gruß Sunday

... wer nicht fragt, bleibt dumm!!!