AGB  ·  Datenschutz  ·  Impressum  







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

{$I-} und {$I+}

Ein Thema von Luckie · begonnen am 3. Jun 2003 · letzter Beitrag vom 3. Jun 2003
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Luckie
Luckie

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

{$I-} und {$I+}

  Alt 3. Jun 2003, 10:51
So sieht jetzt meine Routine aus Zummzusammenfuegen der Dateien. Meine Frage ist jetzt: Habe ich die {$I-} und {$I+} richtig gesetzt? Und wie faengt man Fehler von BlockRead und BlockWrite ab?

Delphi-Quellcode:
{-----------------------------------------------------------------------------
  Procedure : thrJoinFiles - 2003-06-02 04:22:28
  modified  : 2003-06-03
  Author    : Michael Puff
  Purpose  : Thread for joining the file parts
  Arguments : p : pointer
  Result    : Integer
-----------------------------------------------------------------------------}


function thrJoinFiles(p : pointer) : Integer;
var
  DestFile, SourceFile: File;
  i: Integer;
  buffer : array [0..255] of Char;
  s : String;
  MemBuffer : array[0..BLOCKSIZE] of Byte;
  BytesRead, TotalBytesWritten: Integer;
  y : Integer;
label
  TheEnd;
begin
  bRunningJoin := 1;
  result := 0;
  TotalBytesWritten := 0;
  SendDlgItemMessage(hApp, IDC_PROGBAR, PBM_SETPOS, 0, 0);
{$I-}
  AssignFile(DestFile, sFile);
  Rewrite(DestFile, 1);
  if IOResult <> 0 then
  begin
    RaiseLastError(hApp);
{$I+}
    goto TheEnd;
  end;
  for i := 0 to SendDlgItemMessage(hTabDlgs[1], IDC_LST_FILEPARTS, LB_GETCOUNT, 0, 0)-1 do
  begin
    SendDlgItemMessage(hTabDlgs[1], IDC_LST_FILEPARTS, LB_SETCURSEL, i, 0);
    { we need them in the correct order and the listbox ist sorted! }
    SendDlgItemMessage(hTabDlgs[1], IDC_LST_FILEPARTS, LB_GETTEXT, i,
      Integer(@buffer));
    s := Format('Teildatei: %d', [i+1]);
    SetDlgItemText(hApp, IDC_STC_STATUSWND, pointer(s));
    { build filename }
    s := sJoinFiles[0] + '\' + string(buffer);
{$I-}
    AssignFile(SourceFile, s);
    Reset(SourceFile, 1);
    if IOResult <> 0 then
    begin
      RaiseLastError(hApp);
{$I+}
      goto TheEnd;
    end;
    while not eof(SourceFile) do
    begin
      if bRunningJoin = 0 then
      begin
        CloseFile(DestFile);
        goto TheEnd;
      end;
      BlockRead(SourceFile, MemBuffer, sizeof(memBuffer), BytesRead);
      BlockWrite(DestFile, MemBuffer, BytesRead);
      TotalbytesWritten := TotalbytesWritten + BytesRead;
      y := Round((TotalBytesWritten / GetFileSize(Buffer)) * 100);
      SendDlgItemMessage(hApp, IDC_PROGBAR, PBM_SETPOS, y, 0);
    end;
    CloseFile(SourceFile);
    SendDlgItemMessage(hApp, IDC_PROGBAR, PBM_SETPOS, 0, 0);
    TotalBytesWritten := 0;
  end;
  TheEnd :
  CloseFile(DestFile);
  SetDlgItemText(hApp, IDC_STC_STATUSWND, nil);
  SendDlgItemMessage(hApp, IDC_PROGBAR, PBM_SETPOS, 0, 0);
  EnableWindow(GetDlgItem(hTabDlgs[1], IDC_BTN_OPENJOINFILES), TRUE);
  EnableWindow(GetDlgItem(hTabDlgs[1], IDC_BTN_DELFILE), TRUE);
  EnableWindow(GetDlgItem(hTabDlgs[1], IDC_BTN_SAVEAS), TRUE);
  EnableWindow(GetDlgItem(hTabDlgs[1], IDC_CHK_DELPARTS), TRUE);
  EnableWindow(GetDlgItem(hTabDlgs[1], IDC_BTN_JOIN), TRUE);
  EnableWindow(GetDlgItem(hTabDlgs[1], IDC_BTN_CANCELJOIN), FALSE);
end;
PS.:
Die Diskussion mit dem Label und den goto wollen wir hier bitte erst gar nicht anfangen. Ich halte es hier fuer recht sinnvoll.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Domo Sokrat
Domo Sokrat

Registriert seit: 14. Mai 2003
Ort: Wehrheim / Ts.
235 Beiträge
 
Delphi 2006 Professional
 
#2
  Alt 3. Jun 2003, 10:59
Hi Lucky,

es reicht eigentlich aus, wenn Du die Dateioperation (z. B. Rewrite()) zwischen {$I-} und {$I+} stellst.

Sähe dann in etwa so aus:

Code:
 
  :
  SendDlgItemMessage(hApp, IDC_PROGBAR, PBM_SETPOS, 0, 0);
  AssignFile(DestFile, sFile);
  {$I-}
     Rewrite(DestFile, 1);
  {$I+}
  if IOResult <> 0 then
  :
Bei mir gab's nie Probleme mit dieser Methode.
Michael Seeger
Vergesst nicht: Es wird überall nur mit Wasser gekocht
ZEOSLib - Admin-Team
ZeosLib-Forum
  Mit Zitat antworten Zitat
Benutzerbild von Domo Sokrat
Domo Sokrat

Registriert seit: 14. Mai 2003
Ort: Wehrheim / Ts.
235 Beiträge
 
Delphi 2006 Professional
 
#3
  Alt 3. Jun 2003, 11:01
Sorry für den Vertipper in Deinem Namen Asche auf mein Haupt! Das passiert, wenn man zu viele Dinge auf einmal macht...
Michael Seeger
Vergesst nicht: Es wird überall nur mit Wasser gekocht
ZEOSLib - Admin-Team
ZeosLib-Forum
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4
  Alt 3. Jun 2003, 11:06
Und wenn Rewrite bzw. Reset fehlschlaegt, dann kann BlockRead und BlockWrite ja nicht mehr funktionieren, das heisst also, die muesste ich nicht noch mal extra kapseln, wenn ich schon bei Reset bzw. Rewrite aussteige - denke ich mir jetzt mal so.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#5
  Alt 3. Jun 2003, 11:29
Also an sich ist das richtig.
Wenn du den Hinweis meines Vorredners befolgst, kommt es auf das gleiche heraus.

Aber nochwas: Wie kannst du es wagen Labels zu verwenden???

Chris
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#6
  Alt 3. Jun 2003, 11:37
Weil er sonst den ganzen (Reset/Initialisierungs-)Kram am Ende min. 3x schreiben müsste. Für jede Abbruchmöglichkeit der Funktion nämlich. Und da ist ein Label tatsächlich mal nützlich, zumal nur in eine Richtung gesprungen wird.

@Luckie: Ich schreib´s immer so:
Delphi-Quellcode:
{$I-}
AssignFile(f,'bla.bla');
ReSet(f,1);

// mach was mit der geöffneten Datei

CloseFile(f);
{$I-}
Alte Angewohnheit von TP für DOS.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7
  Alt 3. Jun 2003, 11:38
Was ist in diesem Fall gegen die Labels einzuwenden bitte sehr? Wie haettest du es denn geloest ohne die Uebersicht zu verlieren? Mit if's? Na dann aber viel Spass mit den verschachtelten if's ueber mehr als eine Bildschirmseite. Wenn ich mich nit verzaehlt habe waren das vier Ebenen deren Anfang und Ende sehr weit auseinander liegen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8
  Alt 3. Jun 2003, 11:43
Zitat von MathiasSimmack:
Weil er sonst den ganzen (Reset/Initialisierungs-)Kram am Ende min. 3x schreiben müsste. Für jede Abbruchmöglichkeit der Funktion nämlich. Und da ist ein Label tatsächlich mal nützlich, zumal nur in eine Richtung gesprungen wird.
Genau deswegen. Jetzt ist alles am Ende und wenn was schiefgeht, springe ich einfach dahin - fertig ist die Laube.
Zitat:
@Luckie: Ich schreib´s immer so:
Delphi-Quellcode:
{$I-}
AssignFile(f,'bla.bla');
ReSet(f,1);

// mach was mit der geöffneten Datei

CloseFile(f);
{$I-}
Und wo faengst du dann IOResult ab?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Domo Sokrat
Domo Sokrat

Registriert seit: 14. Mai 2003
Ort: Wehrheim / Ts.
235 Beiträge
 
Delphi 2006 Professional
 
#9
  Alt 3. Jun 2003, 11:43
Bissi spät, aber jetzt doch nochmal:
Du hast recht mit den anderen I/O-Zugriffen! Die Geschichte gilt übrigens (so wie ich's gelernt habe) für jeden I/O-Zugriff. Wenn Du also eventuelle Fehler in besagten Zeilen (BlockRead und BlockWrite) auch noch abfangen willst/musst, wäre es sinnvoll, diese Zeilen ebenfalls zwischen {I-} und {I+} einzufassen. Allerdings kann ich Dir jetzt aus der Lamenge nicht sagen, ob jeder Befehl für sich gekapselt werden muss oder ob beide zusammen gekapselt werden können. Müsstest Du mal ausprobieren.
Michael Seeger
Vergesst nicht: Es wird überall nur mit Wasser gekocht
ZEOSLib - Admin-Team
ZeosLib-Forum
  Mit Zitat antworten Zitat
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#10
  Alt 3. Jun 2003, 11:45
Eíne andre Frage.. wieso verwendest du die alten DOS-like Funktionen wie AssignFile BlockRead/Write etc? Ich würde entweder FileStreams oder bei nonVCL direkt auf die WinAPIs zugreifen...!

Zu dem Label.. Ich hätt eine Prozedur erstellt, die den Teil nach dem Label enthält. Mit einem Aufruf der Prozedur und einem darauffolgenenden Exit hätte man dasselbe Ergebnis.. BTW: du schließt DestFile zweimal
Delphi-Quellcode:
      if bRunningJoin = 0 then
      begin
        CloseFile(DestFile); // <--
        goto TheEnd;
      end;
Delphi-Quellcode:
  TheEnd :
  CloseFile(DestFile); // <--
  SetDlgItemText(hApp, IDC_STC_STATUSWND, nil);
Manuel Pöter
  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 22:35 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