AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pointer - Wie verwenden?

Ein Thema von Andreas L. · begonnen am 2. Mär 2009 · letzter Beitrag vom 3. Mär 2009
Antwort Antwort
Seite 1 von 2  1 2      
Andreas L.
(Gast)

n/a Beiträge
 
#1

Pointer - Wie verwenden?

  Alt 2. Mär 2009, 20:57
Abend,
ich habe einer Form zwei Methode verpasst. Einmal LoadValues(FileList TFiles); und SaveValues(FileList: TFiles); (TFiles ist eine TObjectList) Jetzt soll sich das Form beim laden merken, welche Dateiliste übergeben wurde und diese dann zum speichern verwenden. So sieht mein Code bisher aus:

Delphi-Quellcode:
type
  TfrmCookieFiles = class(TForm)
    lblFiles: TLabel;
    lstFiles: TListView;
    btnOK: TButton;
    procedure LoadValues(FileList: TFiles);
    procedure SaveValues(FileList: TFiles);
    procedure btnOKClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    FFileList: Pointer;
  end;

var
  frmCookieFiles: TfrmCookieFiles;

implementation

{$R *.dfm}

procedure TfrmCookieFiles.btnOKClick(Sender: TObject);
begin
  SaveValues(@FFileList);
  lstFiles.Clear;
  Close;
end;

procedure TfrmCookieFiles.LoadValues(FileList: TFiles);
var
  i: Integer;
begin
  FFileList := @FileList;
  for i := 0 to FileList.Count -1 do
  begin
    with lstFiles.Items.Add do
    begin
      Caption := FileList[i].Title;
      SubItems.Add(FileList[i].Profile);
      SubItems.Add(FileList[i].FileName);
      Checked := FileList[i].Checked;
    end;
  end;
end;

procedure TfrmCookieFiles.SaveValues(FileList: TFiles);
var
  i: Integer;
begin
  for i := 0 to lstFiles.Items.Count -1 do
    FileList.GetFileByFileName(lstFiles.Items[i].SubItems[1]).Checked := lstFiles.Items[i].Checked;
end;
Das laden klappt auch einwandfrei, beim Speichern passiert leider nichts. Nehme ich bei SaveValues(@FFileList); das @ weg, kommt eine AV. Was mache ich falsch?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Pointer - Wie verwenden?

  Alt 2. Mär 2009, 21:00
Variablen mit Klassentypen sind schon Referenzen(Zeiger)!
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: Pointer - Wie verwenden?

  Alt 2. Mär 2009, 21:02
Hi,

Wird FFileList überhaupt irgendwo zugeordnet?
Außerdem ist @FFileList ein Pointer, der auf die Pointervariable FFileList zeigt (Ein Pointer also, der auf einen Pointer zeigt). Das hattest du sicherlich nicht vor

Warum übergibst du deiner Funktion nicht einfach eine Variable vom Typ TFiles?
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#4

Re: Pointer - Wie verwenden?

  Alt 2. Mär 2009, 21:03
Zitat von mkinzler:
Variablen mit Klassentypen sind schon Referenzen(Zeiger)!
Wenn ich alle @ weglasse wird trotzdem nicht gespeichert.

Zitat:
Wird FFileList überhaupt irgendwo zugeordnet?
LoadValues wird vom Hauptformular aufgerufen. In LoadValues wirds dann zugeordnet.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Pointer - Wie verwenden?

  Alt 2. Mär 2009, 21:05
hast du auch
FFileList: TFiles; angepasst?
Markus Kinzler
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#6

Re: Pointer - Wie verwenden?

  Alt 2. Mär 2009, 21:07
Zitat von mkinzler:
hast du auch
FFileList: TFiles; angepasst?
Ja
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Pointer - Wie verwenden?

  Alt 2. Mär 2009, 21:12
Was macht/soll den SaveValues den (machen)?
Markus Kinzler
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#8

Re: Pointer - Wie verwenden?

  Alt 2. Mär 2009, 21:17
Zitat von mkinzler:
Was macht/soll den SaveValues den (machen)?
In FileList eintragen, welche Dateien aktiviert (checked) sind.

TFiles sieht so aus:

Delphi-Quellcode:
  TFiles = class(TObjectList)
  protected
    procedure SetItem(Index: Integer; Value: TFile);
    function GetItem(Index: Integer):TFile;
  public
    function Add:Integer;
    function GetFileByFileName(FileName: String):TFile;
    function CheckedCount:Integer;
    function GetCheckBoxStyle:TCheckBoxState;
    property Items[Index: Integer]:TFile read GetItem write SetItem; default;
  end;

  TFile = class(TPersistent)
  private
    FFileName: String;
    FBrowser: String;
    FProfile: String;
    FFormat: TCookieFormat;
    FTitle: String;
    FSize: Int64;
    FChecked: Boolean;
  protected
    procedure Assign(Source: TFile);
  published
    property FileName: String read FFileName write FFileName;
    property Browser: String read FBrowser write FBrowser;
    property Profile: String read FProfile write FProfile;
    property Format: TCookieFormat read FFormat write FFormat;
    property Title: String read FTitle write FTitle;
    property Size: Int64 read FSize write FSize;
    property Checked: Boolean read FChecked write FChecked;
  end;

...

{ TFile }
procedure TFile.Assign(Source: TFile);
begin
  FFileName := Source.FileName;
  FBrowser := Source.Browser;
  FProfile := Source.Profile;
  FFormat := Source.Format;
  FTitle := Source.Title;
  FSize := Source.Size;
  FChecked := Source.Checked;
end;

{ TFiles }
procedure TFiles.SetItem(Index: Integer; Value: TFile);
begin
  inherited Items[Index] := Value;
end;

function TFiles.GetItem(Index: Integer):TFile;
begin
  Result := inherited Items[Index] as TFile;
end;

function TFiles.Add:Integer;
var
  NewFile: TFile;
begin
  NewFile := TFile.Create;
  Result := inherited Add(NewFile);
end;

function TFiles.GetFileByFileName(FileName: string):TFile;
var
  iFile: Integer;
begin
  Result := TFile.Create;
  Result.Checked := False;
  for iFile := 0 to Count -1 do
  begin
    if LowerCase(Items[iFile].FileName) = LowerCase(FileName) then
    begin
      Result.Assign(Items[iFile]);
      Break;
    end;
  end;
end;

function TFiles.CheckedCount:Integer;
var
  iFile: Integer;
begin
  Result := 0;
  for iFile := 0 to Count -1 do
    if Items[iFile].Checked then
      Inc(Result);
end;

function TFiles.GetCheckBoxStyle:TCheckBoxState;
begin
  Result := cbUnchecked;
  if CheckedCount = Count then
    Result := cbChecked
  else if CheckedCount > 0 then
    Result := cbGrayed;
end;
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Pointer - Wie verwenden?

  Alt 3. Mär 2009, 12:17
Der Fehler liegt in der Methode GetFileByName. Dort wird bei jedem Zugriff eine neue Instanz von TFile erzeugt.
Bei dieser Instanz wird dann Checked gesetzt, nicht bei der Instanz in der Liste.
Zusätzlich entsteht noch ein Speicherloch, da keine Freigabe erfolgt.

Delphi-Quellcode:
function TFiles.GetFileByFileName(FileName: string):TFile;
var
  iFile: Integer;
begin
  for iFile := 0 to Count -1 do
  begin
    if LowerCase(Items[iFile].FileName) = LowerCase(FileName) then
    begin
      Result.Assign(Items[iFile]);
      Exit;
    end;
  end;
  Result := nil;
end;
Die Methode SaveValues würde dann aber in ihrer jetzigen Form zu einer Zugriffsverletzung führen,
wenn deren Inhalt nicht mit der dargestellten Listbox übereinstimmt.

Delphi-Quellcode:
procedure TfrmCookieFiles.SaveValues(FileList: TFiles);
var
  i: Integer;
  f: TFile;
begin
  for i := 0 to lstFiles.Items.Count -1 do
  begin
    f := FileList.GetFileByFileName(lstFiles.Items[i].SubItems[1]);
    if Assigned(f) then
      f.Checked := lstFiles.Items[i].Checked;
  end;
end;
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#10

Re: Pointer - Wie verwenden?

  Alt 3. Mär 2009, 14:39
Zitat:
Der Fehler liegt in der Methode GetFileByName.
Ja, das habe ich gestern Nacht auch noch gemerkt. Jetzt funkioniert alles.

Trotzdem danke
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:17 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