AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren

Ein Thema von FarAndBeyond · begonnen am 23. Jun 2015 · letzter Beitrag vom 19. Jul 2016
Antwort Antwort
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren

  Alt 11. Jul 2016, 14:22
Zitat:
Wozu die ganzen Try-Except-Blöcke, wenn sie doch leer sind?
Die sollen doch leer sein. Mein Motto lautet: Geht was schief, dann bitte alles in den ErrorLog... Kann der nicht erstellt werden, dann bitte gar nichts machen.
Wenn etwas nicht so läuft wie ich es erwarte, dann habe ich alles an einer Stelle im ErrorLog, sehe ich keinen, dann konnte er wohl nicht erstellt werden.
Das ist ja auch durchaus legitim, aber dazu reichen einige wenige Exception / Finally Blöcke. Außerdem umschließt du sehr viele Befehle mit Exception Blöcken, bei denen es unmgölich ist, dass überhaupt eine Exception auftritt.

Beim von Luckie schon angesprochenen kontraproduktivem Auslagern von FreeAndNil in eine extra Methode platzierst du beispielsweise einen leeren try..except Block, der niemals greifen kann. Deine StringList erzeugst du ja vorher schon in einem try..finally Resourcen-Schutzblock. Sprich: Die List ist auf jeden Fall erstellt, also kann Free gar nicht fehlschlagen. Dass FreeAndNil hier unnötigt ist, hat Luckie ja auch schon erwähnt. Konkret wäre dies die korrekte Herangehensweise:
Delphi-Quellcode:
SL := TStringList.Create;
try
  // ..
finally
  SL.Free;
end;
Andere Stelle: MSDN-Library durchsuchenEnumWindows. Darauf dass diese API eine Exception schmeißt, kannst du lange warten. Windows APIs besitzen einen Rückgabewert, der geprüft werden muss und schmeißen generell keine Exceptions (von seltenen CPU-Exceptions vielleicht mal abgesehen).

Dann sind an einigen Stellen die Resourcen-Schutzblöcke falsch positioniert. Die ErrorLogExists Funktion sollte beispielsweise eher so aussehen:
Delphi-Quellcode:
function ErrorLogExists: Boolean;
begin
  Result := false;
  if FileExists('ErrorLog.txt') then
  begin
    slLoad := TStringlist.Create;
    try
      slLoad.LoadFromFile('ErrorLog.txt');
      strErrorLog := slLoad.Text;
      Result := true;
    finally
      slLoad.Free;
    end;
  end;
end;
Also erst die StringList erzeugen und dann den Resourcen-Schutzblock mit try einleiten. Wichtig ist, dass das Create nicht mit im Block ist, sonst ist nicht garantiert, dass das Free im finally Block funktioniert.

Dieser Artikel könnte für dich auch noch interessant sein:
http://eurekalog.blogspot.de/2010/05...09-and_05.html
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
FarAndBeyond
(Gast)

n/a Beiträge
 
#2

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren

  Alt 11. Jul 2016, 16:52
@Zacherl:
Ja, du hast ja Recht....
Hab' die ganze Procedure neu gebaut und jetzt ist sie viel besser:

Delphi-Quellcode:
Procedure ErrorLog(ErrorInfo: String);
  Var
   slSave: TStringlist;
 Begin
  Try
   slSave:= TStringlist.Create;
    Try
     If FileExists('ErrorLog.txt')
     Then
      Begin
       Try
        slSave.LoadFromFile('ErrorLog.txt');
       Except
       End;
      End;

      slSave.Text:= DateTimeToStr(Now)+#13#10+
                    ErrorInfo+#13#10+
                    ''+#13#10+
                    slSave.Text;

      slSave.SaveToFile('ErrorLog.txt');
    Finally
     slSave.Free;
    End;
  Except
  End;
 End;
Natürlich ist da immer noch zu viel TryExceptEnd (was ich generell zu übertrieben benutze..) drin... ich brauche halt nur 'nen ErrorLog und möchte weiter nichts sehen...
Danke für die Info mit der Windows-Api... hab' nie groß darüber nachgedacht...

Warum ich das nicht gleich gesehen hab' weiß der Kuckuck...

EDIT:
Ok, das TryExceptEnd hinter Finally ist wirklich quatsch.... (Warum sollte es beim Speicherfreigeben Probleme geben... wahrscheinlich unwahrscheinlich ).
Der erste generelle TryExceptEnd-Block sichert das SaveToFile... (und das Erstellen der Stringlist, wenn ich auch nicht wüßte was da schiefgehen sollte..) hat also zumindest einen Sinn...

Geändert von FarAndBeyond (11. Jul 2016 um 18:17 Uhr)
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren

  Alt 11. Jul 2016, 17:13
Ich musste die eine (!) Routine jetzt zig mal durcharbeiten, um zu verstehen, was die überhaupt macht. Das ist ja vollkommen unübersichtlich mit den ganzen try...excepts.
  Mit Zitat antworten Zitat
FarAndBeyond
(Gast)

n/a Beiträge
 
#4

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren

  Alt 11. Jul 2016, 17:24
Das Ding ist doch völlig linear....

Nirgendwo steht geschrieben, dass du das auch so machen mußt... vielleicht mache ich es irgendwann anders...
  Mit Zitat antworten Zitat
Erdbär
(Gast)

n/a Beiträge
 
#5

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren

  Alt 11. Jul 2016, 19:00
Ich musste die eine (!) Routine jetzt zig mal durcharbeiten, um zu verstehen, was die überhaupt macht. Das ist ja vollkommen unübersichtlich mit den ganzen try...excepts.
Delphi-Quellcode:
procedure ErrorLog(ErrorInfo: string);
var
  slSave: TStringlist;
  sLogFileName: string; // um Logdateinamen vorzugeben
begin
  sLogFileName := ChangeFileExt(paramstr(0), '.log');
  slSave := TStringlist.Create;

  if FileExists(sLogFileName) then slSave.LoadFromFile(sLogFileName);

  slSave.Text := DateTimeToStr(Now) + #13#10 +
    ErrorInfo + #13#10 + #13#10 + slSave.Text;

  try // Schreibrechte im Ordner vorhanden?
    slSave.SaveToFile(sLogFileName);
  except
    MessageBox(0, 'Cannot write to LogFile.', 'ERROR', mb_IconHand);
  end;

  slSave.Free;
end;
Ja, eins sollte reichen
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren

  Alt 11. Jul 2016, 19:06
Und wo ist der Ressourcenschutzblock geblieben?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Erdbär
(Gast)

n/a Beiträge
 
#7

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren

  Alt 11. Jul 2016, 19:17
Was sollte da wie (und warum) geschützt werden?
  Mit Zitat antworten Zitat
FarAndBeyond
(Gast)

n/a Beiträge
 
#8

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren

  Alt 11. Jul 2016, 19:19
Zitat:
if FileExists(sLogFileName) then slSave.LoadFromFile(sLogFileName);
Beim Zugriff auf die Festplatte kann es zu zahlreichen Problemen kommen...

Neue externe Platten verwenden einen Sleep-Modus... ob das "FileExists" da ausreicht um die wachzurütteln???

Nur so ein Gedanke...

btw: Ich hab' bei EnumWindows versucht mit "If" abzufragen und D7 sagt mir "Incompatible Types"... Na ja, muß man ja auch nicht in diesem Fall, hatte mich nur gewundert da das bei "GetClassName" ja auch funzt (Prüfung auf <> 0).

@Erdbär:
Na das bei einer Exception die Stringlist trotzdem freigegeben wird !!!
Angehängte Dateien
Dateityp: txt TwoWinEx.txt (3,2 KB, 6x aufgerufen)
  Mit Zitat antworten Zitat
Erdbär
(Gast)

n/a Beiträge
 
#9

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren

  Alt 11. Jul 2016, 19:29
Starte das Programm doch von einer "schlafenden" Festplatte, vielleicht wacht die HD schon dadurch auf?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren

  Alt 11. Jul 2016, 19:25
Zacherl hat doch in Beitrag http://www.delphipraxis.net/1342361-post39.html gezeigt, wie es geht.

PS: Warum hängst du den Qeulltext als Text-Datei an?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 17:00 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