Delphi-PRAXiS
Seite 2 von 6     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Property "Objects" im Stringgrid (https://www.delphipraxis.net/37738-property-objects-im-stringgrid.html)

Nightshade 11. Jan 2005 20:26

Re: Property "Objects" im Stringgrid
 
Sobald du Text in die Zellen schreibst (muss ja irgendwo passieren :) ), musst du dann auch das Object anhängen.


Und In TestForEdit sollte man dann wirklich abfragen ob ein Object angehängt ist....


Delphi-Quellcode:
function TForm1.TestForEdit(ACol, ARow : integer):boolean;
begin
  if Stringgrid1.Objects[ACol, ARow] <> nil then begin
    MyObject := TMyObject(Stringgrid1.Objects[ACol, ARow]);
    result := MyObject.EditAble;
  end
  else
    result := false;
end;

SirThornberry 11. Jan 2005 20:28

Re: Property "Objects" im Stringgrid
 
beim Stringrid setzt ich das nicht ein (weil ich das nie nutze). Aber bei Listviews zum Beispiel. Ich zeige in der Listview einfach nur einen Titel an und in dem Object was ich da dem Item zuweise werden Bilder, Pfade etc. hinterlegt, je nach dem was das programm macht.

Hansa 13. Jan 2005 18:19

Re: Property "Objects" im Stringgrid
 
Hi,

ich habe das jetzt, zumindest ungefähr geschnallt, aber es tauchen Randeffekte auf :

1. Problem :
das editable Beispiel scheint zu gehen, aber nicht beim erzeugen neuer Grid-Zeilen. Ich konnte das nur realisieren durch Einführen einer neuen Form-globalen Variable. Und zwar so :

Delphi-Quellcode:
procedure TfrmArtNrEin.ErzeugeNeueZeile(Sender: TObject);
begin
  with Sender as TStringgrid do begin
    WertSpeichern;
    NeueZeile := true;   // besetzen von Col und Row ruft SelectCell auf !!
    Col := 1;            // das sgArtNr.Objects darf hier nicht verändert werden
    RowCount := RowCount + 1;
    Row := RowCount - 1;
    NeueZeile := false;  // hier wieder SelectCell einschalten
  end;
end;
Kommentare im Source sind im Zusammenhang wichtig !!

Das SelectCell habe ich dann damit auch noch etwas vergewaltigt : :mrgreen:

Delphi-Quellcode:
procedure TfrmArtNrEin.sgArtNrSelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  EditObject := TEditObject (sgArtNr.Objects [ACol,ARow]);

  CanSelect := EditObject.Editable or NeueZeile; // vorerst Form-global definiert

//showmessage (BoolToStr (CanSelect,true)+IntToStr (ACol)+'  '+IntToStr (ARow));
(*
canselect := true;
*)
end;
Gut, das ganze geht schon so. Diese Variable "NeueZeile" gefällt mir allerdings nicht. Ich finde sie überflüssig. Die Editable Zellen im Grid werden solange richtig behandelt, bis RowCount erhöht werden muß, auch ohne "NeueZeile". Sieht da jemand vielleicht einen Denkfehler ?

2. Problem :

Es geht um das Create dieses Objects. Wenn ich einmal zuviel folgendes aufrufe :

Delphi-Quellcode:
procedure TfrmArtNrEin.AddEditObjectToGrid(ACol, ARow : integer; Editable : boolean);
var
  EditObject : TEditObject;
begin
  EditObject := TEditObject.Create;
  EditObject.EditAble := EditAble;
  sgArtNr.Objects[ACol, ARow] := EditObject;
end;
Was ist dann damit ? Es ist doch created und eventuell doppelt vorhanden. Also laufen in so einem Fall die Stringgrid-Zellen nicht mehr synchron zu den Edit Objects. 8) Also kann ich mich auch nicht darauf verlassen, eine for-Schleife zu verwenden, die Stringgrid-Zellen durchzugehen und zu löschen, hi Kiar :hi: .

Was auch noch den Speicher / das Laufzeitverhalten angeht : spricht etwas dagegen, pro Zelle ein Object mit 5 Bool-Werten anzulegen und wie wirkt sich so was aus ? Denn es ist ein doppelt 2-dimensionales Problem. Muß für jede Zelle im Fall der Fälle das Objects-Array auch wieder sozusagen Zelle um Zelle überprüft werden ?

Christian Seehase 13. Jan 2005 22:05

Re: Property "Objects" im Stringgrid
 
Moin Hansa,

bis zu 32 boolsche Werte kannst Du auch direkt dort speichern, ohne ein Objekt haben zu müssen, es handelt sich ja schliesslich nur um einen 32 Bit grossen Wert, der einen Pointer zu einem Objekt darstellen kann, aber nicht muss.

Nightshade 13. Jan 2005 22:19

Re: Property "Objects" im Stringgrid
 
Warum erstellst du in der Neuen Zeile nicht direkt die Objekte ?

Delphi-Quellcode:
procedure TfrmArtNrEin.ErzeugeNeueZeile(Sender: TObject);
var
  t : integer;
begin
  with Sender as TStringgrid do begin
    WertSpeichern;
    NeueZeile := true;   // besetzen von Col und Row ruft SelectCell auf !! 
    Col := 1;            // das sgArtNr.Objects darf hier nicht verändert werden
    RowCount := RowCount + 1;
    Row := RowCount - 1;
    for t := 0 to pred(rows.Count) do      // Direkt für jede Zelle ein Objekt erstellen.
       AddEditObjectToGrid(t, Row, true);
    NeueZeile := false;  // hier wieder SelectCell einschalten
  end;
end;

Hansa 14. Jan 2005 18:51

Re: Property "Objects" im Stringgrid
 
Zitat:

Zitat von Christian Seehase
...bis zu 32 boolsche Werte kannst Du auch direkt dort speichern, ohne ein Objekt haben zu müssen...

Wo ? Was meinst Du damit ? :shock:

Delphi-Quellcode:
procedure TfrmEin.ChangeEditObjectEditable (ACol, ARow : integer;
                                                    Editable : boolean);
begin
  if sgNr.Objects[ACol, ARow] <> nil then begin
    EditObject := TEditObject (sgNr.Objects[ACol, ARow]);
    EditObject.Editable := Editable;
    sgNr.Objects[ACol, ARow] := EditObject;
  end;
end;
So geht das ganze offensichtlich. Es geht hier darum, eine Eigenschaft des StringGrid-Objektes nur zu verändern unter der Vorrausetzung, daß es schon da ist. 8) Allerdings habe ich andere Aussagen gelesen, daß die Zeile :

Delphi-Quellcode:
EditObject := TEditObject (sgNr.Objects[ACol, ARow]);
Besser gesagt, eine Zuweisung an das Objekt nicht nötig sei, da es ohnehin an die Zelle gebunden ist. Das Object sieht so aus :

Delphi-Quellcode:
  TEditObject = class(TObject)
    public  
      Editable : boolean;
...
  end;
Der Typecast hier :

Delphi-Quellcode:
EditObject := TEditObject (sgNr.Objects[ACol, ARow]);
ist mir im Zusammenhang auch noch nicht vollständig klar.

Wer weiß mehr ? Das Ding ist schon wichtig, aber ich denke schon daran, daß nicht mehr rauskommt als hier :

http://www.delphipraxis.net/internal...ect.php?t=4012

http://www.delphipraxis.net/internal...t=objektablage

Ist zwar schon länger her, aber mittlerweile alles voll im produktiven Einsatz. Dem Thema hier droht wohl dasselbe Schicksal.

Christian Seehase 14. Jan 2005 23:41

Re: Property "Objects" im Stringgrid
 
Moin Hansa,

die Zeile

Delphi-Quellcode:
EditObject := TEditObject (sgNr.Objects[ACol, ARow]);
ist nicht notwendig, da Du das Objekt auch direkt so ansprechen kannst:

Delphi-Quellcode:
procedure TfrmEin.ChangeEditObjectEditable (ACol, ARow : integer;
                                                    Editable : boolean);
begin
  if sgNr.Objects[ACol, ARow] <> nil then begin
    (sgNr.Objects[ACol, ARow] as TEditObject).Editable := Editable;
  end;
end;

Wie sieht eigentlich die vollständige Deklaration Deines EditObjects aus?

kiar 14. Jan 2005 23:51

Re: Property "Objects" im Stringgrid
 
@chris,

moin, das würde mich mal interessieren, wie du das mit den 32 bool werten meinst.

rak

Christian Seehase 15. Jan 2005 00:02

Re: Property "Objects" im Stringgrid
 
Moin Raik,

meine Aussage bezog sich hierauf:

Zitat:

Zitat von Hansa
...spricht etwas dagegen, pro Zelle ein Object mit 5 Bool-Werten anzulegen...

wenn es sich ausschliesslich um boolsche Werte handelt, so lassen sich diese ja in fünf Bits darstellen.
Der Pointer den ein TObject darstellt ist 32-Bit gross, kann also sogar 32 derartige Werte enthalten.
Man muss ja nicht zwingend ein Objekt erzeugen, um den Pointer mit einem Wert zu füllen.

Beispiel (ein wenig auf Hansas Postings bezogen)

Delphi-Quellcode:
const
  _iEditable = $00000001; // Zelle ist editierbar
  _iScanned = $00000020; // Zelleninhalt wurde gescannt
  _iColorRed = $00000040; // Zelle soll rot sein
//...

// Den Pointer mit den beiden Bits belegen
sgNr.Objects[ACol, ARow] := TObject(_iEditable or _iScanned);
Jetzt enthält das Objekt der Zelle die zwei boolschen Werte (gesetzt), ohne dass ein Objekt erzeugt wurde.
Im Beispiel ist jetzt für die Zelle hinterlegt, dass sie editierbar ist, und das ihr derzeitiger Wert durch Scannen erzeugt wurde.
Sie soll nicht rot eingefärbt werden.

kiar 15. Jan 2005 00:07

Re: Property "Objects" im Stringgrid
 
hallo chris,

das ist ja cool ,

danke wieder etwas gelernt. :thumb:

raik


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:04 Uhr.
Seite 2 von 6     12 34     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz