AGB  ·  Datenschutz  ·  Impressum  







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

DCPCrypt Datei zeilenweise verschlüsseln.

Ein Thema von IMPEGA · begonnen am 19. Jun 2014 · letzter Beitrag vom 20. Jun 2014
Antwort Antwort
IMPEGA

Registriert seit: 19. Jan 2008
Ort: Brhv
110 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AW: DCPCrypt Datei zeilenweise verschlüsseln.

  Alt 19. Jun 2014, 18:43
Danke erst Mal für die schnelle Antwort.
So kann ich sehr gut lernen.

Zuerst ein Lob auf deine Art Dinger zu erklären. So verstehe ich es am besten.
Vielen dank dafür.

Ich bin leider kein begabter Coder. Versuche aber mein bestes zu geben.
Liste := TStringlist.Create; // das gehört vor das TRY !!!
Das ist mir aber klar, war ein versehen.

Ich habe nur das relevante zusammen kopiert. Eben beim kopieren übersehen.
Genauso wie except. Ich fange Fehler schon auf, habe es aber für unwichtig gehalten bei der Frage.

ListeCR brauche ich nicht, habe aber gedacht dass mein Ergebnis dadurch verfälscht wird.
Ich habe einiges probiert bis ich mich erst entschlossen habe zu fragen.
So oft Sachen probiert dass ich zum Schluss ganz durcheinander war.

Das aber: Cipher.Burn; // das davor
Ehrlich gesagt habe ich gedacht es gehört nach finally. Schon wieder was gelernt.

Der eigentlicher fahren liegt aber bei der Cipher.InitStr(.......
Das kommt von Unwissenheit.

Hier mein Code was nun funktioniert. Für meine Zwecke vollkommen ausreichend.
Delphi-Quellcode:
procedure TForm1.ButtonDCPEncryptClick(Sender: TObject);
var
  Cipher : TDCP_Cipher;
  DateiName : string;
  Liste : TStringList;
  index : Integer;
begin
  if EditDatei.Text = 'then
    begin
      MessageBox(0, 'Zuerst eine Datei wählen.' ,'Hinweis !' ,MB_ICONWARNING);
      exit;
    end;
  Liste := TStringlist.Create;
    try
      DateiName := ExtractFileName(EditDatei.Text);
      SaveDialog1.Filename := DateiName;
      SaveDialog1.Filter := 'Alle-Dateien|*.*;';
      SaveDialog1.InitialDir := ExtractFilePath(Application.ExeName);
        if SaveDialog1.Execute then
          begin
            Liste.BeginUpdate;
            Liste.LoadFromFile(DateiName);
            Liste.EndUpdate;

            Cipher := TDCP_rijndael.Create(Self);
              try
                try
                  for Index := 0 to Liste.Count - 1 do
                    begin
                      Cipher.InitStr(EditPasswort.Text,TDCP_sha1);
                      Liste.Strings[Index] := Cipher.EncryptString(Liste.Strings[Index]);
                      Cipher.Burn;
                    end;
                except
                  on E:Exception do MessageDlg(E.Message, mtError, [mbOk], 0);
                end;
              finally
                Cipher.Free;
              end;
            Liste.SaveToFile(SaveDialog1.Filename);
          end;
    finally
      Liste.Free;
    end;
  EditDatei.Text := '';
  MessageBox(0, 'DONE' ,'Hinweis !' ,MB_ICONWARNING);
end;
Falls weitere Fehler auftauchen bitte um Korrektur.

Geändert von IMPEGA (19. Jun 2014 um 19:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.583 Beiträge
 
Delphi 12 Athens
 
#2

AW: DCPCrypt Datei zeilenweise verschlüsseln.

  Alt 19. Jun 2014, 20:14
Da brauchst'e eigentlich keine Sorgen haben.
Eine "Kopie" des Strings geht ja in die Funktion und danach wird dann das Ergebnis in die Stringliste geschrieben.
Und da du den alten Zeileninhalt danach nicht mehr braucht, kann man ihn also problemlos gleich ersetzen.

Das Liste := TStringlist.Create; kannst du zwar auch erst in dem Try-Finally machen, aber dann mußt du vor dem Try zumindestens die Variable initialisieren,
so wie es dir bestimmt der Compiler auch in seinen Meldungen gesagt hat.
Grund: Wenn es vor dem Create knallt, wäre die Variable nicht initialisiert und das Free im Finally könnte knallen, aufgrund einer ungültigen Klasseninstanz.
Oder noch schlimmer, wenn der Wert zufällig dem Instanzzeiger irgendeiner Klasse übereinstimmt, dann ist diese Instanz plötzlich weg und es knallt womöglich ganz wo andes irgendwann mal.

Nja, ich weiß jetzt nicht genau was das Burn macht, aber wenn es bei dem Befehl knallen täte, dann würde das Free danach nicht mehr ausgeführt.
Wenn es unbedingt zum Aufräumen nötig ist, dann nochmal ein Try-Except oder Finally drumrum, damit das Free sicher ausgeführt werden kann.
Aber ich hoffe mal die haben beim Destroy dafür gesorgt, daß immer ordentlich aufgeräumt wird, selbst ohne daß das Burn ausgeführt wurde (weil es voher knallte), drum isses einfach vor's Finally gerutscht.

PS: Statt MessageDlg kannst du auch die exceptiondialoge vom Delphi benutzen.
ShowException (SysUtils) ist der Dialog der RTL
Application.ShowException ist der Dialog der VCL
Application.HandleException wendet sich entweder Application.ShowException oder ShowException

Delphi-Quellcode:
try
  ...
except
  Application.HandleException(Self); // oder nil, wenn es keine Owner-Klasse gibt
end;
Uber on E: Exception do E.Message := 'Böser Fehler in Xyz: ' + E.Message; kann man die Meldung erweitern.

Wenn man sich an ApplicationHandleException oder ApplicationShowException (Classes) wenden würde, nur leider gibt es dafür keinen "sicheren" einstieg.
Das macht sich übrigens besser, wenn man mal global Exception-Dialoge ausblenden will/muß (z.B. beim Umbau auf eine Server-App), oder sie zumindestens ersetzen möchte, so wie es z.B. EurekaLog und MadExcept machen, indem sie ihre eigenen erweiterten Dialoge anzeigen.
Delphi-Quellcode:
try
  ...
except
  if Assigned(ApplicationHandleException) then
    ApplicationHandleException(Self)
  else if Assigned(Application) then
    Application.HandleException(Self)
  else
    ShowException(ExceptObject, ExceptAddr);
end;
Delphi-Quellcode:
try
  ...
except
  if Assigned(ApplicationShowException) then
    ApplicationShowException(ExceptObject)
  else if Assigned(Application) then
    Application.ShowException(ExceptObject)
  else
    ShowException(ExceptObject, nil);
end;
k.A. warum Borland/Codegear/Embarcadero das nicht schön in einer Funktion gekapselt haben, damit man sich richtig und vorallem einfach an die Exceptionbehandlung wenden kann.

Application.ShowException zeigt die Meldung immer an
und Application.HandleException ignoriert einige Exceptions (z.B. EAbort), wendet sich ansonsten erstmal an Application.OnException und seit erst dann die Exception an, oder auch nicht ... jenachdem, ob und wie man die Exception "behandelt".



Also einfach immer an Application.HandleException wenden.
Da kann man dann entweder alle Exceptions global im OnException (TApplication oder TApplicationEvents) loggen und oder ausblenden.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
IMPEGA

Registriert seit: 19. Jan 2008
Ort: Brhv
110 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: DCPCrypt Datei zeilenweise verschlüsseln.

  Alt 20. Jun 2014, 06:03
Ich danke dir noch Mal.
Super erklärt und auch für Anfänger verständlich.
Besten Dank.So macht es wirklich Lust auf mehr.

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