Pointer Problem
Hallo,
die Pointer machen mir mal wieder zu schaffen:
Delphi-Quellcode:
So, schön und gut. Versuche ich später die Daten abzufragen
procedure TformEinstellungen.UpdateMacroLV(Mac: TMacro);
var Cmd: TMacroCommand; begin LVMacro.Items.BeginUpdate; try LVMacro.Clear; // Alles wieder rein for Cmd in Mac.Commands do with LVMacro.Items.Add do begin Caption := frmMacro.cbCmdType.Items[Byte(Cmd.CmdType)]; SubItems.Add(ArrayToStr(Cmd.Parameters)); Data := @Cmd; // <--- ? end; finally LVMacro.Items.EndUpdate; end; end;
Delphi-Quellcode:
knallts.
Cmd := TMacroCommand(LVMacro.Selected.Data^);
Vorher wurde extra immer für ein PMacroCommand Speicher reserviert und die Werte dann eingetragen, allerdings ist jeder Command wie man sieht Teil einer TList<TMacroCommand> und .Remove funktioniert nicht, wenn es eben nicht genau das selbe Objekt ist (wer hätte das gedacht...). Warum funktioniert denn das schon wieder nicht? Diese Pointer machen mich noch wahnsinnig... |
Re: Pointer Problem
Das @ vor dem cmd muss weg.
|
Re: Pointer Problem
Das geht nicht, TMacroCommand ist ja kein Pointer, TListItem.Data aber schon.
|
Re: Pointer Problem
Wenn TMacroCommand ne Klasse ist, dann schon. Bei nem Record würds stimmen (d.h. ein @ müsste davor)
Aber ich tippe darauf, dass das Problem ist, dass du einen Zeiger auf ne lokale Variable speicherst, der nach dieser Methode nichtmehr gültig ist. |
Re: Pointer Problem
Es ist ein Record.
|
Re: Pointer Problem
Zitat:
Edit: Ich glaube ich rede Müll |
Re: Pointer Problem
Aber wie kann ich das ändern? Direkt auf den Record in der Liste pointen kann ich ja auch nicht (Variable erwartet), und ich kann nicht irgendwie New() benutzen wie früher, da ich ja diesen Record will und nicht irgendeine Kopie (damit TList<>.Remove geht).
|
Re: Pointer Problem
Ach ich würde es evtl mal so probieren (Weiß aber nich obs nen Unterschied macht):
Delphi-Quellcode:
type
PMacroCommand = ^TMacroCommand; Cmd := PMacroCommand(LVMacro.Selected.Data)^; |
Re: Pointer Problem
Ist glaube ich so ziemlich dasselbe, knallt immer noch :?
|
Re: Pointer Problem
Es sollte mit New() gehen.
Also nen Pointer auf den Record deklarieren, New() verwenden, befüllen eun in der Liste speichern. Alternativ eine Klasse nehmen ;) |
Re: Pointer Problem
Ich glaube die for-in schleife ist das Problem. Du speicherst glaube ich wirklich nur die Adresse von deiner lokalen Cmd Variable. Das Cmd aus der For-schleife enthält also jeweils nur ne Kopie von dem jeweiligen Element in der Liste.
Probiers also mal so:
Delphi-Quellcode:
procedure TformEinstellungen.UpdateMacroLV(Mac: TMacro);
var Cmd: TMacroCommand; i: Integer; begin LVMacro.Items.BeginUpdate; try LVMacro.Clear; // Alles wieder rein for i:= 0 to Mac.Commands.Count-1 do with LVMacro.Items.Add do begin Cmd := Mac.Commands[i]; Caption := frmMacro.cbCmdType.Items[Byte(Cmd.CmdType)]; SubItems.Add(ArrayToStr(Cmd.Parameters)); Data := @Mac.Commands[i]; end; finally LVMacro.Items.EndUpdate; end; end; |
Re: Pointer Problem
Was ist eigentlich TMacroCommand?
|
Re: Pointer Problem
Steht oben, das ist ein Record. Aber die andere interessante Frage ist: was ist TMacro? Klappt es evtl. so?
Delphi-Quellcode:
procedure TformEinstellungen.UpdateMacroLV(var Mac: TMacro);
|
Re: Pointer Problem
Wobei.. Meine Lösung wird wahrscheinlich auch nicht funktionieren. Deine TMacroCommand-Liste sollte PMacroCommand Pointer rausgeben, sonst gehts nicht.
|
Re: Pointer Problem
Also... nochmal zusammengefasst:
TMacro.Commands = PMacroCommand-Liste ! und dann:
Delphi-Quellcode:
procedure TformEinstellungen.UpdateMacroLV(Mac: TMacro);
var Cmd: PMacroCommand; begin LVMacro.Items.BeginUpdate; try LVMacro.Clear; // Alles wieder rein for Cmd in Mac.Commands do with LVMacro.Items.Add do begin Caption := frmMacro.cbCmdType.Items[Byte(Cmd^.CmdType)]; SubItems.Add(ArrayToStr(Cmd^.Parameters)); Data := Cmd; end; finally LVMacro.Items.EndUpdate; end; end; |
Re: Pointer Problem
@himitsu: Wenn es hilft, das ganze sieht so aus:
Delphi-Quellcode:
@jfheins, meinst du sowas (statt Data := @Cmd; in der Schleife):
TMacro = class;
TMacroCommand = record CmdType: TMacroCommandType; Parameters: TArrayofstring; AtTime: Boolean; Time: TTime; Macro: TMacro; end; PMacroCommand = ^TMacroCommand; TMacro = class public Name: string; Loop: Boolean; Commands: TList<TMacroCommand>; constructor Create; destructor Destroy; override; end;
Delphi-Quellcode:
Das funktioniert, allerdings geht p^.Macro.Commands.Remove(p^) dann nicht, weil p <> Cmd.
New(p);
p^.CmdType := Cmd.CmdType; p^.Parameters := Cmd.Parameters; p^.Macro := Cmd.Macro; Data := p; @Neutral General (1): Sowas ähnliches dachte ich mir. Aber direkt das Element in der Liste adressieren geht ja auch nicht.. @Neutral General (2): Oh gott. Aber eig eine gute Idee, werde ich mal probieren. Edit: Leute, ihr seid klasse! :dp: Mit TList<PMacroCommand> läuft nun alles wie es soll :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:24 Uhr. |
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