AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Probleme mit TStrings/TStringlist beim Freigeben
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit TStrings/TStringlist beim Freigeben

Ein Thema von xZise · begonnen am 6. Sep 2006 · letzter Beitrag vom 13. Sep 2006
Antwort Antwort
Seite 2 von 2     12   
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#11

Re: Probleme mit TStrings/TStringlist beim Freigeben

  Alt 7. Sep 2006, 08:24
Hi,

dieses Problem kenne ich auch. Du hast die Instanz von Files an einer anderen Stell oder in einem vorherigen Durchlauf zerstört. Wenn Du das mit Free oder destroy tust, dann wird die Variable Files nicht nil gesetzt. Leider hilft hier meiner Erfahrung nach auch kein Assigned. Dort wird auch nur geprüft, ob nil.

Ich habe mir folfendes angewöhnt:
Delphi-Quellcode:
  try
    IF assigned(Files) then FreeandNil(Files);
  finally
    Files := nil;
  end;
Ich finde diese Variante auch nicht besonders toll, aber es funzt.

Gruß oki

(oki edit: except in finally)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#12

Re: Probleme mit TStrings/TStringlist beim Freigeben

  Alt 7. Sep 2006, 08:58
1. Die IF Abfrage kannst du dir sparen, weil das macht Free selber auch...
2. FreeAndNil() kannst du dir auch sparen und einfach nur Free aufrufen, da der Finally Block ja so oder so aufgerufen wird...
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#13

Re: Probleme mit TStrings/TStringlist beim Freigeben

  Alt 7. Sep 2006, 11:21
Hi Muetze1,

Du hast recht wenn alles so geht wie soll. Meine Erfahrungen sind aber folgende:

- Free setzt Variable nicht auf nil,
- If Assigned() liefert nach Free True,

Nun probier mal folgendes aus:
Delphi-Quellcode:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var O : TObject;
begin
  O.free;
end;
Und die Exception läßt grüßen.

gruß oki
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#14

Re: Probleme mit TStrings/TStringlist beim Freigeben

  Alt 7. Sep 2006, 11:28
Hi Muetze1,

tschuldige, habe folgenden Kommentar weiter oben von dir übersehen:
Zitat von Muetze1:
Zitat von 3_of_8:
Free funktioniert auch bei nicht instantiierten Objekten. Der Grund liegt auf der Hand.
Man sollte dazu aber erwähnen, dass Free nur dann ordentlich mit nicht-instanziierten Objekten funktioniert, wenn entweder eine gültige Instanzenadresse in der Variablen enthalten ist oder Nil. Bei allem anderen knallt es auch mit Free - ausser man hat ein wenig Glück und der Sprung in's Datennirvana beim Aufruf vom Destruktor landet irgendwo bei was kompatiblen...
Nun sollte man wirklich finally gegen except oder FreeandNil gegen Free austauschen.

gruß oki
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#15

Re: Probleme mit TStrings/TStringlist beim Freigeben

  Alt 7. Sep 2006, 16:19
Hier ist die Unit:

Delphi-Quellcode:
type
  TfrmOp = class(TForm)
    {...}
  private
    {...}
    Files : TStrings;
    {...}
  public
    {...}
  end;

var
  frmOp : TfrmOp;
  {...}

implementation

{$R *.dfm}

{...}

function TfrmOp.Execute : Boolean;
var i : Integer;
begin
  {...}

  try
    // Show form
    ShowModal;
    if Files <> nil then
      Files.Free;
    Files := TStringList.Create;

    // Return Files
    if not Abort then begin
      for i := FoundDirs.Count - 1 to DataView.Items.Count - 1 do begin
        if DataView.Items[i].Selected then
          Files.Add(FolderShellTreeView.Path + '\' + DataView.Items[i].Caption);
      end;
    end;
  finally
    {...}
  end;
end;

function TfrmOp.GetFiles : TStrings;
begin
  if Files <> nil then
    Result := Files;
end;

procedure TfrmOp.FolderShellTreeViewChange(Sender: TObject;
  Node: TTreeNode);
var
  sr : TSearchRec;
  Ext : string;
begin
  DataView.Clear;
  if (FoundFiles <> nil) and (FoundDirs <> nil) then begin
    FoundFiles.Clear;
    FoundDirs.Clear;
    if FindFirst(FolderShellTreeView.Path + '\*.*',faAnyFile,sr) = 0 then
      try
        repeat
          if ((sr.Attr and faDirectory) = faDirectory) then begin
            if not((sr.Name = '.') or (sr.Name = '..')) then begin
              Application.ProcessMessages;
              with DataView.Items.Add do begin
                ImageIndex := 0;
                Caption := sr.Name;
              end;
              FoundDirs.Add(sr.Name);
            end;
          end;
        until FindNext(sr) <> 0;
      finally
        FindClose(sr);
      end;
    if FindFirst(FolderShellTreeView.Path + '\*.*',faAnyFile,sr) = 0 then
      try
        repeat
          if ((sr.Attr and faDirectory) <> faDirectory) then begin
            Application.ProcessMessages;
            Ext := LowerCase(ExtractFileExt(sr.Name));
           // if (Ext = '.mp3') or (Ext = '.wav') then begin
           // with DataView.Items.Add do begin
           // ImageIndex := 1;
           // Caption := sr.Name;
           // end;
           // FoundFiles.Add(sr.Name);
           // end;

            if cbFilter.ItemIndex = 0 then
            begin
              if (Ext = '.mp3') or (Ext = '.wav') or (Ext = '.wma')
                or (Ext = '.aiff') or (Ext = '.ogg') or (Ext = '.mpeg')
                or (Ext = '.mpg') or (Ext = '.wmv') or (Ext = '.avi') then
              begin
                with DataView.Items.Add do
                begin
                  ImageIndex := 1;
                  Caption := sr.Name;
                end;
                FoundFiles.Add(sr.Name);
              end;
            end else

            if cbFilter.ItemIndex = 1 then
            begin
              if (Ext = '.mp3') or (Ext = '.wav') or (Ext = '.wma')
                or (Ext = '.aiff') or (Ext = '.ogg') then
              begin
                with DataView.Items.Add do
                begin
                  ImageIndex := 1;
                  Caption := sr.Name;
                end;
                FoundFiles.Add(sr.Name);
              end;
            end else

            if cbFilter.ItemIndex = 2 then
            begin
              if (Ext = '.mpeg') or (Ext = '.mpg') or (Ext = '.wmv')
                or (Ext = '.avi') then
              begin
                with DataView.Items.Add do
                begin
                  ImageIndex := 1;
                  Caption := sr.Name;
                end;
                FoundFiles.Add(sr.Name);
              end;
            end else

            if cbFilter.ItemIndex = 3 then
            begin
              if (Ext = '.mp3') then
              begin
                with DataView.Items.Add do
                begin
                  ImageIndex := 1;
                  Caption := sr.Name;
                end;
                FoundFiles.Add(sr.Name);
              end;
            end else

            if cbFilter.ItemIndex = 4 then
            begin
              if (Ext = '.wav') then
              begin
                with DataView.Items.Add do
                begin
                  ImageIndex := 1;
                  Caption := sr.Name;
                end;
                FoundFiles.Add(sr.Name);
              end;
            end else

            if cbFilter.ItemIndex = 5 then
            begin
              if (Ext = '.ogg') then
              begin
                with DataView.Items.Add do
                begin
                  ImageIndex := 1;
                  Caption := sr.Name;
                end;
                FoundFiles.Add(sr.Name);
              end;
            end else

            if cbFilter.ItemIndex = 6 then
            begin
              if (Ext = '.wma') then
              begin
                with DataView.Items.Add do
                begin
                  ImageIndex := 1;
                  Caption := sr.Name;
                end;
                FoundFiles.Add(sr.Name);
              end;
            end else

            if cbFilter.ItemIndex = 7 then
            begin
              if (Ext = '.aiff') then
              begin
                with DataView.Items.Add do
                begin
                  ImageIndex := 1;
                  Caption := sr.Name;
                end;
                FoundFiles.Add(sr.Name);
              end;
            end else

            if cbFilter.ItemIndex = 8 then
            begin
              if (Ext = '.mpeg') or (Ext = '.mpg') then
              begin
                with DataView.Items.Add do
                begin
                  ImageIndex := 1;
                  Caption := sr.Name;
                end;
                FoundFiles.Add(sr.Name);
              end;
            end else

            if cbFilter.ItemIndex = 9 then
            begin
              if (Ext = '.wmv') then
              begin
                with DataView.Items.Add do
                begin
                  ImageIndex := 1;
                  Caption := sr.Name;
                end;
                FoundFiles.Add(sr.Name);
              end;
            end else

            if cbFilter.ItemIndex = 10 then
            begin
              if (Ext = '.avi') then
              begin
                with DataView.Items.Add do
                begin
                  ImageIndex := 1;
                  Caption := sr.Name;
                end;
                FoundFiles.Add(sr.Name);
              end;
            end else

            if cbFilter.ItemIndex = 11 then
            begin
              if (Ext = '.mp3') or (Ext = '.wav') or (Ext = '.wma') or (Ext = '.aiff') or (Ext = '.ogg') then begin
                with DataView.Items.Add do begin
                  ImageIndex := 1;
                  Caption := sr.Name;
                end;
              end else if (Ext = '.mpeg') or (Ext = '.mpg') or (Ext = '.wmv') or (Ext = '.avi') then begin
                with DataView.Items.Add do begin
                  ImageIndex := 2;
                  Caption := sr.Name;
                end;
              end else begin
                with DataView.Items.Add do begin
                  ImageIndex := 3;
                  Caption := sr.Name;
                end;
              end;
              FoundFiles.Add(sr.Name);
            end;
          end;
        until FindNext(sr) <> 0;
      finally
        FindClose(sr);
      end;
  end;
end;

procedure TfrmOp.DataViewDblClick(Sender: TObject);
var
  i : Integer;
  Path : string;
begin
  if DataView.Selected <> nil then begin
    for i := 0 to DataView.Items.Count do begin
      if DataView.Items[i].Selected then begin
        // Is Directory
        if i < FoundDirs.Count then begin
          Path := FolderShellTreeView.Path;
          if FolderShellTreeView.Path[Length(FolderShellTreeView.Path)] <> '\then
            Path := Path + '\';
          FolderShellTreeView.Path := Path + FoundDirs[i];
        end;
      end;
    end;
  end;
end;

procedure TfrmOp.DataViewSelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
var
  i : Integer;
  Path : string;
begin
  xiOpen.Enabled := false;
  if DataView.Selected <> nil then begin
    for i := 0 to DataView.Items.Count do begin
      if DataView.Items[i].Selected then begin
        xiOpen.Enabled := true;
      end;
    end;
  end;
end;

end.
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#16

Re: Probleme mit TStrings/TStringlist beim Freigeben

  Alt 7. Sep 2006, 16:49
Setzte die Zeile:

    Files := TStringList.Create; ins OnCreate-Event und an die entsprechende Stelle
Files.Clear; TfrmOp.GetFiles ist auch sehr unglücklich wenn Files = nil. Dann ist der Rückgabewert undefiniert (solltest eine Compilerwarning bekommen).
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#17

Re: Probleme mit TStrings/TStringlist beim Freigeben

  Alt 7. Sep 2006, 16:56
Okay... So funktionierts NICHT!

[edit]Doch nicht ![/edit]
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#18

Re: Probleme mit TStrings/TStringlist beim Freigeben

  Alt 9. Sep 2006, 15:23
Der NICHT funktionierende Code:
Angehängte Dateien
Dateityp: pas op1_169.pas (17,5 KB, 2x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#19

Re: Probleme mit TStrings/TStringlist beim Freigeben

  Alt 13. Sep 2006, 20:33
Hallo? Niemand eine Idee? Find ich geil Wir haben einen Delphi-Bug (gefunden)...
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 05:37 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