|
| StringGrid farver Fra : Henning Madsen |
Dato : 24-11-05 19:22 |
|
I en StringGrid's kolonne har jeg lavet det så man kan ændre tekstens farve
i tilfældige
seller.
procedure TForm1.XStringGrid1CellProps(Sender: TObject; Canvas: TCanvas;
var Alignment: TAlignment; var CellText: String; AState: TGridDrawState;
Row, Col: Integer);
Var
T : Integer;
begin
For T := 1 to XStringGrid1.RowCount -1 Do Begin
If (Col = 6) And (XRow = T) Then Canvas.Font.Color := clGray;
End;
end;
procedure TForm1.XStringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
XRow := ARow; // XRow er defineret i private,
end;
Kan det laves således at når man klikker på en selle der er grå bliver den
sort og omvendt.
Mener det kræver en måde at læse skriftens farve på, har ledt mange steder
men entet fundet. Det kan selvfølgelig laves via en Ini fil, men det er ikke
lige det der var iden.
Hvis der er en af jer der kender en løsning, vel det være meget velkommen.
På forhånd tak.
mvh
Henning
| |
Tiscali (23-12-2005)
| Kommentar Fra : Tiscali |
Dato : 23-12-05 13:06 |
|
Hej Henning,
jeg håber jeg har forstået dig korrekt. Nederst er noget source kode du kan
prøve med. Det er skrevet løst i hånden. Du skal opfinde en datastruktur som
kan indholde dine nødvendige oplysninger. Kan ikke helt forstå det du
skriver omkring .Ini filen? Grunden til, at jeg har valgt en Record er, at
man sagtens kunne forestille sig at du med tiden skulle bruge flere
informationer end lige om en Celle har været valgt eller ej.
Jeg ville nok har valgt en dynamisk struktur, så Row og Col størrelsen kunne
vokse afhængig hvor mange celler du rent faktisk har brug for. Meeen, det
tager lidt længere tid... Du justerer bare const'anterne hvis jeg ikke har
afsat nok plads.
Jeg har ikke skrevet koden i Delphi, så hvis der er et par Syntax fejl må du
have mig undskyldt (o;
Jeg håber du kan bruge det.
Helt og lykke...
/Brian
const
CellMaxRow = 10;
CellMaxCol = 10;
type
TCellData = record
Selected: Boolean;
end;
TCellArray[0..CellMaxRow, 0..CellMaxCol] of TCellData;
TForm1 = class(TForm)
private
FCells: TCellArray;
procedure Clear;
public
constructor Create(AOwner: TComponent); override;
end;
constructor TForm1.Create(AOwner: TComponent);
begin
inherited;
Clear;
end;
procedure TForm1.Clear;
var
Row, Col: Integer;
begin
for Row := 0 to CellMaxRow do
for Col := 0 to CellMaxCol do
FCells[Row, Col].Selected := False;
end;
procedure TForm1.XStringGrid1CellProps(Sender: TObject; Canvas: TCanvas;
var Alignment: TAlignment; var CellText: String; AState: TGridDrawState;
Row, Col: Integer);
begin
if FCells[Row, Col].Selected then
Canvas.Font.Color := clGray else
Canvas.Font.Color := clBlack;
end;
| |
Henning Madsen (27-12-2005)
| Kommentar Fra : Henning Madsen |
Dato : 27-12-05 16:31 |
|
"Tiscali" <x@x.x> skrev i en meddelelse
news:CIRqf.3204$Cl2.92188@news000.worldonline.dk...
> Hej Henning,
>
> jeg håber jeg har forstået dig korrekt. Nederst er noget source kode du
> kan prøve med. Det er skrevet løst i hånden. Du skal opfinde en
> datastruktur som kan indholde dine nødvendige oplysninger. Kan ikke helt
> forstå det du skriver omkring .Ini filen? Grunden til, at jeg har valgt en
> Record er, at man sagtens kunne forestille sig at du med tiden skulle
> bruge flere informationer end lige om en Celle har været valgt eller ej.
>
> Jeg ville nok har valgt en dynamisk struktur, så Row og Col størrelsen
> kunne vokse afhængig hvor mange celler du rent faktisk har brug for.
> Meeen, det tager lidt længere tid... Du justerer bare const'anterne hvis
> jeg ikke har afsat nok plads.
>
> Jeg har ikke skrevet koden i Delphi, så hvis der er et par Syntax fejl må
> du have mig undskyldt (o;
>
> Jeg håber du kan bruge det.
>
> Helt og lykke...
>
> /Brian
>
> const
> CellMaxRow = 10;
> CellMaxCol = 10;
>
> type
> TCellData = record
> Selected: Boolean;
> end;
>
> TCellArray[0..CellMaxRow, 0..CellMaxCol] of TCellData;
>
> TForm1 = class(TForm)
> private
> FCells: TCellArray;
> procedure Clear;
> public
> constructor Create(AOwner: TComponent); override;
> end;
>
> constructor TForm1.Create(AOwner: TComponent);
> begin
> inherited;
> Clear;
> end;
>
> procedure TForm1.Clear;
> var
> Row, Col: Integer;
> begin
> for Row := 0 to CellMaxRow do
> for Col := 0 to CellMaxCol do
> FCells[Row, Col].Selected := False;
> end;
>
> procedure TForm1.XStringGrid1CellProps(Sender: TObject; Canvas: TCanvas;
> var Alignment: TAlignment; var CellText: String; AState: TGridDrawState;
> Row, Col: Integer);
> begin
> if FCells[Row, Col].Selected then
> Canvas.Font.Color := clGray else
> Canvas.Font.Color := clBlack;
> end;
>
>Tak for svaret Brian
Har rodet meget med programmet men forstår ikke helt hvor koderne, fra dit
navn til første Procedyre(constructor), skal plaseres i hovedet.
Det er mugligvis en for stor opgave jeg er gået i gang med.
Mener XStringGridden er bedst egnet til formålet.
Helt kongret var ideen den at der i kolonne 0 Stod ca. 10 medarbejder navne,
med sort skrift.
Ved klik på et eller flere navne(fraværende) skal skriftfarven ændres til
rød og igen ved klik på et rødt navn sætte skriftfarven til sort.
I de næste kolonner med overskriften Djob1 Djob2 o.s.v. kunne der ud for
hvert navn
sættes et X i den kolonne som representer det djob som medarbejderen var
uddannet til.
Man vælger det eller de djob der skal udføres og klikker på det i Row 0. Og
straks bliver navnene på de medarbejder der kan udføre djobbet farvet Grønne
dog ikke dem der er røde.(et djob af gangen).
Der vælges så den medarbejder der skal udfører opgaven med et klik og straks
får det
aktuelle navn farven Grå. Og eventuelle andre grønne navne får farven Sort.
Kan man styrer de mange forskellige farver, mener jeg det giver en nem
betjæning af programmet.
Eventuelle ideer vel være meget velkommen.
mvh
Henning
| |
Brian Andersen \(www~ (28-12-2005)
| Kommentar Fra : Brian Andersen \(www~ |
Dato : 28-12-05 09:30 |
|
Som sagt, så har jeg ikke selv testet programmet. Jeg tror nu det burde
virke *s'.
Denne del af programmet skal skrives i interface delen:
>> const
>> CellMaxRow = 10;
>> CellMaxCol = 10;
>>
>> type
>> TCellData = record
>> Selected: Boolean;
>> end;
>>
>> TCellArray[0..CellMaxRow, 0..CellMaxCol] of TCellData;
Det her er din for, hvor du har din grid. Delphi generer automatisk kode
her, men du kan også selv skrive kode:
>> TForm1 = class(TForm)
>> private
>> FCells: TCellArray;
>> procedure Clear;
>> public
>> constructor Create(AOwner: TComponent); override;
>> end;
Den her kode skal du skrive i implementeringsdelen:
>> constructor TForm1.Create(AOwner: TComponent);
>> begin
>> inherited;
>> Clear;
>> end;
>>
>> procedure TForm1.Clear;
>> var
>> Row, Col: Integer;
>> begin
>> for Row := 0 to CellMaxRow do
>> for Col := 0 to CellMaxCol do
>> FCells[Row, Col].Selected := False;
>> end;
Det her er metoden fra din grid, som tegner hvilken tekstfarve de enkelte
celler skal have...
>> procedure TForm1.XStringGrid1CellProps(Sender: TObject; Canvas: TCanvas;
>> var Alignment: TAlignment; var CellText: String; AState: TGridDrawState;
>> Row, Col: Integer);
>> begin
>> if FCells[Row, Col].Selected then
>> Canvas.Font.Color := clGray else
>> Canvas.Font.Color := clBlack;
>> end;
Opdager lige, at der ikke er implementeret nogle MouseClick event, så
tekstfarven rent faktisk kan skifte (o;
Meeen, koden vil se nogen lunde sådan her ud. Jeg har ikke din XStringGrid,
så jeg har taget udgangspunkt i den almindelige StringGrid.
procedure TForm1.XStringGrid1Click(Sender: TObject);
begin
FCells[XStringGrid1.Row, XStringGrid1.Col] := not FCells[XStringGrid1.Row,
XStringGrid1.Col];
XStringGrid1.Invalidate;
end;
Værdierne skal sættes til henholdsvis True/False når der klikkes på en
celle. Dette bestemmer tekstfarven i XStringGrid1CellProps. Musen skal så
styre værdien og dette gøres via XStringGrid1Click.
Du bliver nok nød til at eksperimentere en del, hvis du skal have et system
til gøre som du beskriver.
/Brian
| |
|
|