/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
EmiStringGrid
Fra : Henning Madsen


Dato : 12-01-06 22:06

I mangel af noget der kan vise farven på skriften i en StringGrid selle
fandt jeg komponenten EmiStriGrid, men den er desværre uden hjælp. I
reklamen over den
er oplyst at Properties også har
1 ColTitles: Set text for each cell of the first row (column titles)
2 RowTitles: Set text for each cell of the first column (row titles)
3 DefaultCellsAlignment: defines the default text alignment for all cells of
the grid at design-time.
4 DefaultMultiLineCells: defines the default text multi-line capability at
design-time.
Events:
1 OnGetCellColor: allows Brush, Font, alignment and multi-line capability to
set at run-time for each cell of the grid.
Det er denne Events jeg mener kan hente farven på skriften i en valgt celle.
Men hvordan bruges den ????
Sender Procedure hovedet med i håb om at der er en, som kan vise mig
hvordan.

procedure TForm1.EmiStringGrid1GetCellColor(Sender: TObject; ARow,
ACol: Integer; AState: TGridDrawState; var Alignment: TCellAlignment;
var MultiLine: Boolean; ABrush: TBrush; AFont: TFont);

Det jeg mangler er en instruktion der kan gøre følgende
S := SkriftFarven i celle [ARow, ACol].
Hvis det overhovedet er mugligt håber jeg der er en der kan give mig
løsningen.
mvh
Henning.






 
 
Brian Andersen \(www~ (13-01-2006)
Kommentar
Fra : Brian Andersen \(www~


Dato : 13-01-06 08:46

Hej Henning,

du bliver nød til at opfinde en datastruktur, som gemmer de enkeltes cellers
tilstand. Ud fra tilstanden vælger du farven til cellen. Se nogle af mine
tidligere svar til dig.

Det, der skal ske når GetCellColor bliver kaldt er, at du lave et opslag i
den datastruktur. Læs tilstanden og returnerer farven i ABrush eller AFont.
GetCellColor metoden har ingen Memory eller lignende. Den husker ikke den
farve du vælger for den enkelte celle. Du skal sørge for at returnere farven
hver eneste gang GetCellColor bliver kaldt.

/Brian



Henning Madsen (13-01-2006)
Kommentar
Fra : Henning Madsen


Dato : 13-01-06 11:50


"Brian Andersen (www.europeansoftwarehouse.com)" <x@x.x> skrev i en
meddelelse news:QSIxf.4577$Cl2.106549@news000.worldonline.dk...
> Hej Henning,
>
> du bliver nød til at opfinde en datastruktur, som gemmer de enkeltes
> cellers tilstand. Ud fra tilstanden vælger du farven til cellen. Se nogle
> af mine tidligere svar til dig.
>
> Det, der skal ske når GetCellColor bliver kaldt er, at du lave et opslag i
> den datastruktur. Læs tilstanden og returnerer farven i ABrush eller
> AFont. GetCellColor metoden har ingen Memory eller lignende. Den husker
> ikke den farve du vælger for den enkelte celle. Du skal sørge for at
> returnere farven hver eneste gang GetCellColor bliver kaldt.
>
> /Brian
Hej Brian tak for dit hurtige svar , men jeg tror vi misforstår. Jeg har
ikke brug for at gemme farverne. Programmet starter op med sorte skrift
farver brugeren eller programmet ændre farverne . Det har jeg nogenlude
styr på.
Men jeg mangler noget der kan fortælle mig hvad farven i selle[ARow,ACol]
er så jeg kan bruge det til søgekreterie.

Ligeledes mangler jeg en funktion hvor man kan vælge, ved klik på en celle ,
om der er brugt højre
eller venstre muse knap.
Dette virker, men kun på formen.
If Button = MBRight Then Showmessage ('Det var højre knap');
If Button = MBLeft Then Showmessage ('Det var venstre knap');
Håber jeg har udtrykt mig forståeligt.
Jeg kan godt se at jeg er på dybt vand ? men en løsning på disse 2 spørsmål
vel klare mine problemer.
På forhånd tak for et svar.
mvh.
Henning



Brian Andersen \(www~ (13-01-2006)
Kommentar
Fra : Brian Andersen \(www~


Dato : 13-01-06 12:18

>> /Brian
> Hej Brian tak for dit hurtige svar,

Det var så lidt.

men jeg tror vi misforstår. Jeg har ikke brug for at gemme farverne.
Programmet starter op med sorte skrift
> farver brugeren eller programmet ændre farverne . Det har jeg nogenlude
> styr på.
> Men jeg mangler noget der kan fortælle mig hvad farven i selle[ARow,ACol]
> er så jeg kan bruge det til søgekreterie.

Jeg tror jeg er helt med på hvad du mener (o; Som jeg skriver, så findes der
ingen "Memory"/nogle egenskaber i de simple Grids du bruger. Du bliver selv
nød til at opfinde en datastruktur der holder øje med farverne i cellerne.
Hvis du ønsker en komplet grid med disse egenskaber, så ville jeg foreslå
QuantumGrid 5 fra DevExpress.com med den koster penge. Jeg vil mene, at det
eneste du kan få af celle egenskaber er teksten i cellen. Du kan ikke få
farve oplysninger, da denne egenskab ikke findes på celle niveau.


> Ligeledes mangler jeg en funktion hvor man kan vælge, ved klik på en celle
> , om der er brugt højre
> eller venstre muse knap.
> Dette virker, men kun på formen.
> If Button = MBRight Then Showmessage ('Det var højre knap');
> If Button = MBLeft Then Showmessage ('Det var venstre knap');
> Håber jeg har udtrykt mig forståeligt.
> Jeg kan godt se at jeg er på dybt vand ? men en løsning på disse 2
> spørsmål vel klare mine problemer.
> På forhånd tak for et svar.
> mvh.
> Henning

Jeg forstår ikke helt hvad du spørger om her???

/Brian



Henning Madsen (13-01-2006)
Kommentar
Fra : Henning Madsen


Dato : 13-01-06 13:00


"Brian Andersen (www.europeansoftwarehouse.com)" <x@x.x> skrev i en
meddelelse news:WZLxf.4582$Cl2.106618@news000.worldonline.dk...
>>> /Brian
>> Hej Brian tak for dit hurtige svar,
>
> Det var så lidt.
>
> men jeg tror vi misforstår. Jeg har ikke brug for at gemme farverne.
> Programmet starter op med sorte skrift
>> farver brugeren eller programmet ændre farverne . Det har jeg nogenlude
>> styr på.
>> Men jeg mangler noget der kan fortælle mig hvad farven i selle[ARow,ACol]
>> er så jeg kan bruge det til søgekreterie.
>
> Jeg tror jeg er helt med på hvad du mener (o; Som jeg skriver, så findes
> der ingen "Memory"/nogle egenskaber i de simple Grids du bruger. Du bliver
> selv nød til at opfinde en datastruktur der holder øje med farverne i
> cellerne. Hvis du ønsker en komplet grid med disse egenskaber, så ville
> jeg foreslå QuantumGrid 5 fra DevExpress.com med den koster penge. Jeg vil
> mene, at det eneste du kan få af celle egenskaber er teksten i cellen. Du
> kan ikke få farve oplysninger, da denne egenskab ikke findes på celle
> niveau.
>
>
>> Ligeledes mangler jeg en funktion hvor man kan vælge, ved klik på en
>> celle , om der er brugt højre
>> eller venstre muse knap.
>> Dette virker, men kun på formen.
>> If Button = MBRight Then Showmessage ('Det var højre knap');
>> If Button = MBLeft Then Showmessage ('Det var venstre knap');
>> Håber jeg har udtrykt mig forståeligt.
>> Jeg kan godt se at jeg er på dybt vand ? men en løsning på disse 2
>> spørsmål vel klare mine problemer.
>> På forhånd tak for et svar.
>> mvh.
>> Henning
>
> Jeg forstår ikke helt hvad du spørger om her???
>
> /Brian

Hej igen Brian
I en Event der hedder StringGrid1SelectCell
Har jeg følgende kode
SetCellTextColor(0,ARow, 255); //Rød
SetCellTextColor(0,ARow, 0); //Sort
Når jeg programmessigt vælger en af linierne virker det ok
Men ønsker at ved klik med venstre museknap køres
SetCellTextColor(0,ARow,255)
Og med højre museknap køres SetCellTextColor(0ARow,0)
Mener valget af højre eller venstre museknap ikke direkte kan laves i
Proceduren StringGrid1SelectCell fordi der ikke er en TMouseButton
Mener også jeg har set et sted hvordan disse muse knapper kan vælges.
Håber dette er oplysninger nok. Ellers må vi prøve igen. Håber din
tolmodighed slår til.
mvh.
Henning

>



Brian Andersen \(www~ (13-01-2006)
Kommentar
Fra : Brian Andersen \(www~


Dato : 13-01-06 14:16

Ahh, ok. Jeg kender ikke din EmiStringGrid. Jeg kan forstå at den er
udstyret med farve egenskaber på celle niveau. Det gør det hele en del
nemmere.

Der er dog en ting, som altid er god praksis og det er at håndtere logik i
en datastruktur. Det vil sige, at dit farvevalg skal bestemmes af et flag i
en datastruktur. Det er "ikke god praksis" at aflæse den farve Grid Cellen
allerede har og så foretage et farveskift ud fra denne. Man "bør" have en
datastruktur, som skifter tilstand. Ud fra tilstanden vælges farven, når
Grid'en tegnes. Nååhhh, nok om det. Det er jo dit program og ikke mit (o;

Ja, du har ganske ret i, at SelectCell ikke fortæller hvilken museknap der
trykkes på. Mit eksempel tager udgangspunkt i den almindelige StringGrid, så
jeg håber du kan bruge det i din EmiStringGrid. Jeg ville implementere det i
MouseDown methoden. Jeg har skrevet følgende i løs hånd, så jeg håber det
virker. I stedet for at udvide TEmiStringGrid, så kan du også implementere
det i MouseDown Event'et. Såfrem din EmiStringGrid nedarver fra TCustomGrid,
så husk lige at inkludere Grids i din uses sætning.

Gi' lige besked om min kode virker...

/Brian

{ Udvidelse }

TMyStringGrid = class(TEmiStringGrid)
protected
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
end;

TMyStringGrid.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
var
GridCoord: TGridCoord;
begin
inherited;

GridCoord := MouseCoord(X, Y);

if Button = mbLeft then
SetCellTextColor(0, Y, 255);

if Button = mbRight then
SetCellTextColor(0, GridCoord.Y, 0)
end;


{ MouseDown Event }

TEmiStringGrid1.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
var
GridCoord: TGridCoord;
begin
GridCoord := EmiStringGrid1.MouseCoord(X, Y);

if Button = mbLeft then
EmiStringGrid1.SetCellTextColor(0, Y, 255);

if Button = mbRight then
EmiStringGrid1.SetCellTextColor(0, GridCoord.Y, 0)
end;



Henning Madsen (13-01-2006)
Kommentar
Fra : Henning Madsen


Dato : 13-01-06 17:04


"Brian Andersen (www.europeansoftwarehouse.com)" <x@x.x> skrev i en
meddelelse news:2INxf.4585$Cl2.106390@news000.worldonline.dk...
> Ahh, ok. Jeg kender ikke din EmiStringGrid. Jeg kan forstå at den er
> udstyret med farve egenskaber på celle niveau. Det gør det hele en del
> nemmere.
>
> Der er dog en ting, som altid er god praksis og det er at håndtere logik i
> en datastruktur. Det vil sige, at dit farvevalg skal bestemmes af et flag
> i en datastruktur. Det er "ikke god praksis" at aflæse den farve Grid
> Cellen allerede har og så foretage et farveskift ud fra denne. Man "bør"
> have en datastruktur, som skifter tilstand. Ud fra tilstanden vælges
> farven, når Grid'en tegnes. Nååhhh, nok om det. Det er jo dit program og
> ikke mit (o;
>
> Ja, du har ganske ret i, at SelectCell ikke fortæller hvilken museknap der
> trykkes på. Mit eksempel tager udgangspunkt i den almindelige StringGrid,
> så jeg håber du kan bruge det i din EmiStringGrid. Jeg ville implementere
> det i MouseDown methoden. Jeg har skrevet følgende i løs hånd, så jeg
> håber det virker. I stedet for at udvide TEmiStringGrid, så kan du også
> implementere det i MouseDown Event'et. Såfrem din EmiStringGrid nedarver
> fra TCustomGrid, så husk lige at inkludere Grids i din uses sætning.
>
> Gi' lige besked om min kode virker...
>
> /Brian
>
> { Udvidelse }
>
> TMyStringGrid = class(TEmiStringGrid) Hvor skal dette skrives ?
> protected Og Hvor skal dette skrives ?
//-----------------------------------------------------------------------------------
> procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
> X, Y: Integer); override; Mangler der ikke noget i denne
> procedure ?
> end;
//----------------------------------------------------------------------------------
> TMyStringGrid.MouseDown(Button: TMouseButton; Shift: TShiftState;
> X, Y: Integer);
> var
> GridCoord: TGridCoord;
> begin
> inherited;
>
> GridCoord := MouseCoord(X, Y);
>
> if Button = mbLeft then
> SetCellTextColor(0, Y, 255);
>
> if Button = mbRight then
> SetCellTextColor(0, GridCoord.Y, 0)
> end;
//---------------------------------------------------------------------------------
> { MouseDown Event }
> TEmiStringGrid1.MouseDown(Button: TMouseButton; Shift: TShiftState;
Min procedure hedder
Form1.EmiStringGrid1. ok resten af linien
> X, Y: Integer);
> var
> GridCoord: TGridCoord;
> begin
> GridCoord := EmiStringGrid1.MouseCoord(X, Y);
>
> if Button = mbLeft then
> EmiStringGrid1.SetCellTextColor(0, Y, 255);
>
> if Button = mbRight then
> EmiStringGrid1.SetCellTextColor(0, GridCoord.Y, 0)
> end;
//-----------------------------------------------------------------------------------------------
Hej igen Brian
Har lavet nogle spørsmål i dit program
Håber du vel kommenterer dem.
mvh.
Henning



Brian Andersen \(www~ (14-01-2006)
Kommentar
Fra : Brian Andersen \(www~


Dato : 14-01-06 12:32

Den første del af udvedelsen af din EmiStringGrid skrives i interface delen
(deklarationsdelen) af din .pas fil. Lige som når du ser på sourcekoden til
en Form. Her står TForm1 = class(TForm). Man kan sagtens selv definere singe
egen klasser. Implementeringen af klassen sker i Implementation delen. Det
er det som eksemplet viser. Ønsker ud ikke at implementere din egen klasse,
så kan du bruge eksempel nr. to.

>> { Udvidelse }
>>
>> TMyStringGrid = class(TEmiStringGrid) Hvor skal dette skrives ?
>> protected Og Hvor skal dette skrives ?
> //-----------------------------------------------------------------------------------
>> procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
>> X, Y: Integer); override; Mangler der ikke noget i denne
>> procedure ?
>> end;
> //----------------------------------------------------------------------------------
>> TMyStringGrid.MouseDown(Button: TMouseButton; Shift: TShiftState;
>> X, Y: Integer);
>> var
>> GridCoord: TGridCoord;
>> begin
>> inherited;
>>
>> GridCoord := MouseCoord(X, Y);
>>
>> if Button = mbLeft then
>> SetCellTextColor(0, Y, 255);
>>
>> if Button = mbRight then
>> SetCellTextColor(0, GridCoord.Y, 0)
>> end;


Da du ikke er helt stærk på de objekt orienterede begreber, så vil jeg
foreslå, at du bruger nedenstående kode. Jeg håber det virker.

> //---------------------------------------------------------------------------------
>> { MouseDown Event }
>> TEmiStringGrid1.MouseDown(Button: TMouseButton; Shift: TShiftState;
> Min procedure hedder
> Form1.EmiStringGrid1. ok resten af linien
>> X, Y: Integer);
>> var
>> GridCoord: TGridCoord;
>> begin
>> GridCoord := EmiStringGrid1.MouseCoord(X, Y);
>>
>> if Button = mbLeft then
>> EmiStringGrid1.SetCellTextColor(0, GridCoord.Y, 255); <------ !! Har
>> lavet en rettelse !!
>>
>> if Button = mbRight then
>> EmiStringGrid1.SetCellTextColor(0, GridCoord.Y, 0)
>> end;
> //-----------------------------------------------------------------------------------------------
> Hej igen Brian
> Har lavet nogle spørsmål i dit program
> Håber du vel kommenterer dem.
> mvh.
> Henning
>



Henning Madsen (14-01-2006)
Kommentar
Fra : Henning Madsen


Dato : 14-01-06 16:33


"Brian Andersen (www.europeansoftwarehouse.com)" <x@x.x> skrev i en
meddelelse news:43c8e147$0$2433$edfadb0f@dread14.news.tele.dk...
> Den første del af udvedelsen af din EmiStringGrid skrives i interface
> delen (deklarationsdelen) af din .pas fil. Lige som når du ser på
> sourcekoden til en Form. Her står TForm1 = class(TForm). Man kan sagtens
> selv definere singe egen klasser. Implementeringen af klassen sker i
> Implementation delen. Det er det som eksemplet viser. Ønsker ud ikke at
> implementere din egen klasse, så kan du bruge eksempel nr. to.
>
>>> { Udvidelse }
>>>
>>> TMyStringGrid = class(TEmiStringGrid) Hvor skal dette skrives ?
>>> protected Og Hvor skal dette skrives ?
>> //-----------------------------------------------------------------------------------
>>> procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
>>> X, Y: Integer); override; Mangler der ikke noget i denne
>>> procedure ?
>>> end;
>> //----------------------------------------------------------------------------------
>>> TMyStringGrid.MouseDown(Button: TMouseButton; Shift: TShiftState;
>>> X, Y: Integer);
>>> var
>>> GridCoord: TGridCoord;
>>> begin
>>> inherited;
>>>
>>> GridCoord := MouseCoord(X, Y);
>>>
>>> if Button = mbLeft then
>>> SetCellTextColor(0, Y, 255);
>>>
>>> if Button = mbRight then
>>> SetCellTextColor(0, GridCoord.Y, 0)
>>> end;
>
>
> Da du ikke er helt stærk på de objekt orienterede begreber, så vil jeg
> foreslå, at du bruger nedenstående kode. Jeg håber det virker.
>
>> //---------------------------------------------------------------------------------
>>> { MouseDown Event }
>>> TEmiStringGrid1.MouseDown(Button: TMouseButton; Shift: TShiftState;
>> Min procedure hedder
>> Form1.EmiStringGrid1. ok resten af linien
>>> X, Y: Integer);
>>> var
>>> GridCoord: TGridCoord;
>>> begin
>>> GridCoord := EmiStringGrid1.MouseCoord(X, Y);
>>>
>>> if Button = mbLeft then
>>> EmiStringGrid1.SetCellTextColor(0, GridCoord.Y, 255); <------ !!
>>> Har lavet en rettelse !!
>>>
>>> if Button = mbRight then
>>> EmiStringGrid1.SetCellTextColor(0, GridCoord.Y, 0)
>>> end;
>> //-----------------------------------------------------------------------------------------------
>> Hej igen Brian
>> Har lavet nogle spørsmål i dit program
>> Håber du vel kommenterer dem.
>> mvh.
>> Henning
>>
> Velkommen Brian
Hvor er det uretfærdigt jo mere man lærer om delphi finder man ud af hvor
lidt man ved?
Har som du foreslog lavet følgende procedure

procedure TForm1.XStringGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
GridCoord: TGridCoord;
begin
GridCoord := XStringGrid1MouseCoord(X,Y);

if Button = mbLeft then
XStringGrid1.SetCellTextColor(0,GridCoord.Y,255);

if Button = mbRight then
XStringGrid1.SetCellTextColor(0,GridCoord.Y,0);
end;
Men får ved kompiling følgende Undeclared indentifier
XStringGrid1'MouseCoord'
med markering her GridCoord := XStringGrid1MouseCoord!!!!(X,Y);
Hvad er vi nu ude i , skal vi til det svære ?
mvh.
Henning



Henning Madsen (14-01-2006)
Kommentar
Fra : Henning Madsen


Dato : 14-01-06 22:31


"Henning Madsen" <HKM@madsen.tdcadsl.dk> skrev i en meddelelse
news:43c918f8$0$1758$edfadb0f@dread11.news.tele.dk...
>
> "Brian Andersen (www.europeansoftwarehouse.com)" <x@x.x> skrev i en
> meddelelse news:43c8e147$0$2433$edfadb0f@dread14.news.tele.dk...
Hej igen Brian
Har fået dit program til at kører uden kompiler fejl.
Ser nu sådan ud
procedure TForm1.XStringGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
GridCoord: TGridCoord;
begin
GridCoord := XStringGrid1.MouseCoord(X,Y);
if Button = mbLeft then
SetCellTextColor(0,GridCoord.Y,255);
if Button = mbRight then
setCellTextColor(0,GridCoord.Y,0);
end;
Men om det er procedyrens fejl eller min delphi 7 der er itu skal jeg ikke
kunne sige.
Kan køre programmet mange gange men så kommer fejlen
Invalid pointer operation. om det skyldes procedyren eller min delphi ved
jeg ikke for
nogle gange har den ved opstart ændret farven i en celle tilsyneladende af
sig selv.
mvh.
Henning



Brian Andersen \(www~ (16-01-2006)
Kommentar
Fra : Brian Andersen \(www~


Dato : 16-01-06 07:28

Jeg skal ikke kunne sige, hvad der er er skyld i din 'Invalid Pointer
Operation'? Jeg kan ikke umiddelbart se, hvad der skulle fejle i MouseDown
proceduren? Godt at du fik det til at virke.

Prøv at slå MouseDown proceduren fra? Se om du fortsat får fejlen. Får du
fortsat fejlen, så må du sætte nogle Break Points forskellige steder i dit
program og Debugge dig igennem.

/Brian



Søg
Reklame
Statistik
Spørgsmål : 177439
Tips : 31962
Nyheder : 719565
Indlæg : 6408069
Brugere : 218879

Månedens bedste
Årets bedste
Sidste års bedste