Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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:
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.
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?
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;
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.
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.
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;
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.
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.
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.
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.
Jeg fandt denne kode til at fjerne markøren: StringGrid1.Selection := TGridRect(Rect(-1,-1,-1,-1));
Synes godt om
Ny brugerNybegynder
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.