Avatar billede js_delphi Nybegynder
02. juli 2007 - 18:28 Der er 22 kommentarer og
2 løsninger

Komponent til visning af værdier i rækker og kollonner?

Hej,

jeg skal bruge en komponent til følgende eksempel:

3 personer har hver især deres data, f.eks.:
Vægt
Højde
Alder

Nu vil jeg gerne have det hele til at stå i kollonner og rækker således:

          Person1  Person2  Person3
Vægt      81        85        79
Højde    185      166      198
Alder    20        32        31

Hvilken komponent kan jeg med fordel bruge, hvis jeg ønsker at vise, loade, behandle og gemme de data, som står i felterne?

Ps.
helst ingen database-komponent.

På forhånd tak!
Avatar billede kfz Nybegynder
03. juli 2007 - 12:17 #1
Brug Stringgrid i fanen Additional.
Avatar billede kfz Nybegynder
03. juli 2007 - 12:17 #2
hvis du har brug for det kan jeg godt lave et lille eksempel.
Avatar billede js_delphi Nybegynder
03. juli 2007 - 13:17 #3
Hej kfz,

jeg sidder faktisk og roder med StringGrid lige nu (fandt den i mellemtiden).
Men et par informationer paa vejen ville ikke skade...

Jeg har laest mange tidligere spoergsmaal igennem, om hvordan man farver en celle
i f.eks. groen. Kan det virkelig passe, at denne funktion ikke er direkte implementeret, og at man derfor skal goere det som f.eks. her:

http://www.eksperten.dk/spm/23988

??
Avatar billede kfz Nybegynder
03. juli 2007 - 13:34 #4
ja desværre, problemet er at en stringgrid kører et array af strings, som hedder cells.

Der for er den eneste værdi en enkelt cell kan antage, en string eks.
StringGrid1.Cells[1,1] := 'Hej';
Avatar billede kfz Nybegynder
03. juli 2007 - 13:34 #5
du kan derfor ikke angive en farve til en celle.
Avatar billede js_delphi Nybegynder
03. juli 2007 - 16:13 #6
Det er sgu da for åndsvagt, at en sådan egenskab ikke er indbygget.

Kan du give et eksempel på dette:
Et tryk på Button1 skifter farven i celle 2,2 til grøn.

Alle de eksempler, jeg har læst igennem, bruger StringGrid1DrawCell eventen.
Det bliver man sikkert også nødt til, men hvordan gøres det flexibelt, således man til hver en tid kan vælge hvilken celle, der skal have hvilken farve?

Jeg skal nemlig sætte forskellige celler til forskellige farver flere steder i mit program.
Avatar billede kfz Nybegynder
04. juli 2007 - 00:49 #7
skal lige lave min mors computer nu her. men strikker et eksempel sammen i morgen.
Avatar billede js_delphi Nybegynder
04. juli 2007 - 16:36 #8
Hvordan står det til med din mors computer...?
Avatar billede kfz Nybegynder
04. juli 2007 - 18:53 #9
jeg er i gang med et eksempel, mangler bare lige at få lavet et ordentligt array, er der et fast antal Rows og Cols, eller skifter det undervejs i programmet?
Avatar billede kfz Nybegynder
04. juli 2007 - 23:50 #10
Smid en Stringgrid, en Button og en ColorDialog på formen, lad dem hedde deres standard navne.

Sæt Stringgrid'ens FixedRows til 0, og FixedCols til 0.

Indsæt herefter følgende kode, og tildel de enkelte komponenter procedurerne.




unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    ColorDialog1: TColorDialog;
    Button1: TButton;
    procedure StringGrid1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    NewColor: TColor;
    Color: array[0..4,0..4] of TColor;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.StringGrid1Click(Sender: TObject);
var
Rect: TRect;
begin
Color[Stringgrid1.Col,Stringgrid1.Row] := NewColor;
Stringgrid1.Repaint;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
I,J: Integer;
begin
For I := 0 To 4 Do
  For J := 0 To 4 Do
    Color[I,J] := ClWhite;
NewColor := ColorDialog1.Color;
end;



procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
Stringgrid1.Canvas.Brush.Color := Color[ACol,ARow];
Stringgrid1.Canvas.FillRect(Rect);
Stringgrid1.Canvas.TextOut(Rect.Left+2,Rect.Top+2,Stringgrid1.Cells[ACol,ARow]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
If ColorDialog1.Execute Then
  NewColor := ColorDialog1.Color;
end;

end.
Avatar billede kfz Nybegynder
04. juli 2007 - 23:54 #11
Sæt evt. et panel på formen, og udskift button1click med følgende:

procedure TForm1.Button1Click(Sender: TObject);
begin
If ColorDialog1.Execute Then
Begin
  NewColor := ColorDialog1.Color;
  Panel1.Color := NewColor;
End;
end;

husk også at sætte Panel1.Color := ColorDialog1.Color; i formens oncreate.


Så kan man hele tiden se hvilken farve der er valgt.
Avatar billede kfz Nybegynder
04. juli 2007 - 23:56 #12
Grunden til at DrawCell bruges, er at man når man har haft et andet vindue inde over formen, stadig har farverne i sin Grid.
Avatar billede js_delphi Nybegynder
05. juli 2007 - 09:38 #13
Min DrawCell procedure ser indtil videre sådan ud:

procedure TFrmMain.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);

  procedure WriteText(StringGrid: TStringGrid; ACanvas: TCanvas; const ARect: TRect;
  const Text: string; Format: Word);
  const
    DX = 2;
    DY = 2;
  var
    S: array[0..255] of Char;
  begin
    with Stringgrid, ACanvas, ARect do
    begin
      case Format of
      DT_CENTER:
        ExtTextOut(Handle, Left + (Right - Left - TextWidth(Text)) div 2,
        Top + DY, ETO_OPAQUE or ETO_CLIPPED, @ARect,
        StrPCopy(S, Text), Length(Text), nil);
      end;
    end;
  end;

  procedure Display(StringGrid: TStringGrid; const S: string; Alignment: TAlignment);
  const
    Formats: array[TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER);
  begin
    WriteText(StringGrid, StringGrid.Canvas, Rect, S, Formats[Alignment]);
  end;
  begin
    // Center all rows
    Display(StringGrid1, StringGrid1.Cells[ACol, ARow], taCenter)
  end;

Alt sammen kun for at centrere teksterne i cellerne...!

Hvordan kan jeg tilføje din kode i min DrawCell procedure?
Hver gang jeg forsøger at tilføje en begin/end;, brokker compileren sig.
Avatar billede kfz Nybegynder
05. juli 2007 - 10:49 #14
procedure TFrmMain.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);

  procedure WriteText(StringGrid: TStringGrid; ACanvas: TCanvas; const ARect: TRect;
  const Text: string; Format: Word);
  const
    DX = 2;
    DY = 2;
  var
    S: array[0..255] of Char;
  begin
    with Stringgrid, ACanvas, ARect do
    begin
      case Format of
      DT_CENTER:
        ExtTextOut(Handle, Left + (Right - Left - TextWidth(Text)) div 2,
        Top + DY, ETO_OPAQUE or ETO_CLIPPED, @ARect,
        StrPCopy(S, Text), Length(Text), nil);
      end;
    end;
  end;

  procedure Display(StringGrid: TStringGrid; const S: string; Alignment: TAlignment);
  const
    Formats: array[TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER);
  begin
    WriteText(StringGrid, StringGrid.Canvas, Rect, S, Formats[Alignment]);
  end;
  begin
    // Center all rows
    Display(StringGrid1, StringGrid1.Cells[ACol, ARow], taCenter);
    Stringgrid1.Canvas.Brush.Color := Color[ACol,ARow];
    Stringgrid1.Canvas.FillRect(Rect);
    Stringgrid1.Canvas.TextOut(Rect.Left+2,Rect.Top+2
    ,Stringgrid1.Cells[ACol,ARow]);
  end;
Avatar billede js_delphi Nybegynder
05. juli 2007 - 12:58 #15
Nu funker det, dog et par småting:

1:
Når programmer starter op, er celle 1,1 (den første ikke fixed celle) markeret med blå farve. Hvordan kan man generelt fjerne denne markering?

2:
De farvede celler står og blinker af og til, da de jo hele tiden bliver opdateret.
Hvordan forhindrer man det? Ved nogle komponenter kan man f.eks. sætte noget, som hedder doublebuffered til True, for at klare problemet.
Avatar billede kfz Nybegynder
05. juli 2007 - 14:24 #16
1 - skal jeg nok lige kigge på i aften, har ikke nogen løsning i hovedet.

2 - de bliver ikke hele tiden opdateret, med mindre du har en timer sat til som kalder dens repaint. den bliver kun opdateret når der ændres i dens canvas - f.eks. textout, eller når du trækker et andet vindue ind over din form, og fjerner det igen.
Avatar billede kfz Nybegynder
05. juli 2007 - 22:23 #17
1 - mener du ikke at den viser firkanten i designtime, i runtime viser den da kun en stiplet linie rundt om cellen?
Avatar billede js_delphi Nybegynder
06. juli 2007 - 08:20 #18
Jeg har beskrevet problemet forkert - undskyld for det.

Problemet er, at hvis f.eks. celle 1,1 er markeret (med den stiplede firkant), og jeg derefter indtaster noget i et Edit felt et andet sted på siden, så skifter skrift-farven (font) i den markerede celle i StringGriden til hvid. Normalt skal alle celler have sort skrift.
Dette sker dog ikke, hvis jeg laver et helt nyt projekt kun med en StringGrid og en TEdit, så det har vel et eller anden med min kode i StringGrid1DrawCell proceduren at gøre.
Avatar billede kfz Nybegynder
06. juli 2007 - 11:10 #19
ok. lyder spøjst. er det muligt at du kan sende mig hele dit projekt, så jeg kan kigge på det, meget gerne på messenger: Kenneth_F_Z@Hotmail.Com
Avatar billede js_delphi Nybegynder
06. juli 2007 - 13:50 #20
Prøv dette:

Opret nyt projekt.
Træk en StringGrid og en Edit ind på formen.
Kør projektet.
Hvis du nu stiller dig i en celle i StringGriden, bliver cellen markeret med en stiplet linie omkring.
Prøv så at stille markøren i Edit boksen.
Nu bliver cellen i StringGriden blå (og skriften hvid).
Problemet i mit program er, at jeg holder baggrunden hvid (med din kode).
Derfor kan jeg ikke se skriften, da den jo ligeledes bliver hvid.

Hvordan kan man deaktivere denne markør?
Avatar billede kfz Nybegynder
06. juli 2007 - 16:02 #21
ok, prøver jeg lige i aften.
Avatar billede kfz Nybegynder
06. juli 2007 - 22:26 #22
jeg får desværre ikke tid i aften alligevel, prøver at se om jeg kan finde tid i morgen.
Avatar billede js_delphi Nybegynder
04. december 2007 - 16:01 #23
Lukker. Vi deler point, da vi ikke fandt en loesning paa den sidste fejl.
Tak for hjaelpen.
Avatar billede js_delphi Nybegynder
21. april 2008 - 08:28 #24
Jeg fandt denne kode til at fjerne markøren:
StringGrid1.Selection := TGridRect(Rect(-1,-1,-1,-1));
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester