![]() |
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; |
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.
|
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:
Kommentare im Source sind im Zusammenhang wichtig !!
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; Das SelectCell habe ich dann damit auch noch etwas vergewaltigt : :mrgreen:
Delphi-Quellcode:
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 ?
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; 2. Problem : Es geht um das Create dieses Objects. Wenn ich einmal zuviel folgendes aufrufe :
Delphi-Quellcode:
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: .
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 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 ? |
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. |
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; |
Re: Property "Objects" im Stringgrid
Zitat:
Delphi-Quellcode:
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 :
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;
Delphi-Quellcode:
Besser gesagt, eine Zuweisung an das Objekt nicht nötig sei, da es ohnehin an die Zelle gebunden ist. Das Object sieht so aus :
EditObject := TEditObject (sgNr.Objects[ACol, ARow]);
Delphi-Quellcode:
Der Typecast hier :
TEditObject = class(TObject)
public Editable : boolean; ... end;
Delphi-Quellcode:
ist mir im Zusammenhang auch noch nicht vollständig klar.
EditObject := TEditObject (sgNr.Objects[ACol, ARow]);
Wer weiß mehr ? Das Ding ist schon wichtig, aber ich denke schon daran, daß nicht mehr rauskommt als hier : ![]() ![]() Ist zwar schon länger her, aber mittlerweile alles voll im produktiven Einsatz. Dem Thema hier droht wohl dasselbe Schicksal. |
Re: Property "Objects" im Stringgrid
Moin Hansa,
die Zeile
Delphi-Quellcode:
ist nicht notwendig, da Du das Objekt auch direkt so ansprechen kannst:
EditObject := TEditObject (sgNr.Objects[ACol, ARow]);
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? |
Re: Property "Objects" im Stringgrid
@chris,
moin, das würde mich mal interessieren, wie du das mit den 32 bool werten meinst. rak |
Re: Property "Objects" im Stringgrid
Moin Raik,
meine Aussage bezog sich hierauf: Zitat:
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:
Jetzt enthält das Objekt der Zelle die zwei boolschen Werte (gesetzt), ohne dass ein Objekt erzeugt wurde.
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); 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. |
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 18:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz