3. Praktische Anwendung 2: Verwendung von Streams zur Erstellung ausführbarer E-Grußkarten
Wir sehen oft eine Software zum Erstellen von E-Cards, mit der Sie Bilder selbst auswählen können, und dann
Es wird eine ausführbare EXE-Datei für Sie generiert. Wenn Sie die Grußkarte öffnen, wird das Bild angezeigt, während Musik abgespielt wird.
Nachdem wir nun Stream-Operationen gelernt haben, können wir auch eine erstellen.
Beim Hinzufügen von Bildern können wir die vorherige Cjt_AddtoFile direkt verwenden. Jetzt müssen wir nur noch die Vorgehensweise festlegen
Das Bild wird gelesen und angezeigt. Wir verwenden das vorherige Cjt_LoadFromFile, um das Bild auszulesen und als Datei zu speichern.
Eine Übertragung ist auch möglich, aber es gibt eine einfachere Möglichkeit, den Dateistream direkt einzulesen und anzuzeigen
Mit diesem leistungsstarken Tool wird alles einfacher.
Die beliebtesten Bilder sind heutzutage das BMP-Format und das JPG-Format. Wir werden nun über diese beiden Arten von Bildern schreiben
Verlassen Sie die Lese- und Anzeigefunktion.
Funktion Cjt_BmpLoad(ImgBmp:TImage;SourceFile:String):Boolean;
var
Quelle:TFileStream;
MyFileSize:integer;
beginnen
Source:=TFileStream.Create(SourceFile,fmOpenRead oder fmShareDenyNone);
versuchen
versuchen
Source.Seek(-sizeof(MyFileSize),soFromEnd);
Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));//Ressourcen lesen
Source.Seek(-MyFileSize,soFromEnd);//Suchen Sie die Startposition der Ressource
ImgBmp.Picture.Bitmap.LoadFromStream(Source);
Endlich
Quelle.Frei;
Ende;
außer
Ergebnis:=Falsch;
Ausfahrt;
Ende;
Ergebnis:=True;
Ende;
Das Obige ist eine Funktion zum Lesen von BMP-Bildern und das Folgende ist eine Funktion zum Lesen von JPG-Bildern, da JPG-Einheiten verwendet werden
So fügen Sie dem Programm einen Satz hinzu: Verwendet JPEG.
Funktion Cjt_JpgLoad(JpgImg:Timage;SourceFile:String):Boolean;
var
Quelle:TFileStream;
MyFileSize:integer;
Myjpg: TJpegImage;
beginnen
versuchen
Myjpg:= TJpegImage.Create;
Source:=TFileStream.Create(SourceFile,fmOpenRead oder fmShareDenyNone);
versuchen
Source.Seek(-sizeof(MyFileSize),soFromEnd);
Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));
Source.Seek(-MyFileSize,soFromEnd);
Myjpg.LoadFromStream(Source);
JpgImg.Picture.Bitmap.Assign(Myjpg);
Endlich
Quelle.Frei;
Myjpg.free;
Ende;
außer
Ergebnis:=false;
Ausfahrt;
Ende;
Ergebnis:=true;
Ende;
Mit diesen beiden Funktionen können wir ein Ausleseprogramm erstellen. Nehmen wir als Beispiel BMP-Bilder:
Führen Sie Delphi aus, erstellen Sie ein neues Projekt und platzieren Sie ein Bildanzeigesteuerelement Image1. Im Fenster erstellen
Schreiben Sie einfach einen Satz in die Veranstaltung:
Cjt_BmpLoad(Image1,application.ExeName);
Dies ist die Header-Datei, und dann verwenden wir die vorherige Methode, um eine head.res-Ressourcendatei zu generieren.
Jetzt können wir mit der Erstellung unseres Zusatzprogramms beginnen. Der gesamte Code lautet wie folgt:
Einheit Einheit1;
Schnittstelle
verwendet
Windows, Nachrichten, SysUtils, Klassen, Grafiken, Steuerelemente, Formulare, Dialoge,
ExtCtrls, StdCtrls, ExtDlgs;
Typ
TForm1 = Klasse(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
OpenPictureDialog1: TOpenPictureDialog;
PROzedur FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
Privat
Funktion ExtractRes(ResType, ResName, ResNewName : String):boolean;
Funktion Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
{Private Erklärungen}
öffentlich
{Öffentliche Erklärungen}
Ende;
var
Form1: TForm1;
Durchführung
{$R *.DFM}
Funktion TForm1.ExtractRes(ResType, ResName, ResNewName : String):boolean;
var
Res: TResourceStream;
beginnen
versuchen
Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
versuchen
Res.SavetoFile(ResNewName);
Ergebnis:=true;
Endlich
Res.Frei;
Ende;
außer
Ergebnis:=false;
Ende;
Ende;
Funktion TForm1.Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
var
Ziel,Quelle:TFileStream;
MyFileSize:integer;
beginnen
versuchen
Source:=TFileStream.Create(SourceFile,fmOpenRead oder fmShareExclusive);
Target:=TFileStream.Create(TargetFile,fmOpenWrite oder fmShareExclusive);
versuchen
Target.Seek(0,soFromEnd);//Ressourcen am Ende hinzufügen
Target.CopyFrom(Source,0);
MyFileSize:=Source.Size+Sizeof(MyFileSize);// Berechnen Sie die Ressourcengröße und schreiben Sie sie an das Ende des Hilfsprozesses
Target.WriteBuffer(MyFileSize,sizeof(MyFileSize));
Endlich
Ziel.Frei;
Quelle.Frei;
Ende;
außer
Ergebnis:=Falsch;
Ausfahrt;
Ende;
Ergebnis:=True;
Ende;
procedure TForm1.FormCreate(Sender: TObject);
beginnen
Bildunterschrift:='Bmp2Exe-Demonstrationsprogramm Autor: Chen Jingtao';
Edit1.Text:=';
OpenPictureDialog1.DefaultExt := GraphicExtension(TBitmap);
OpenPictureDialog1.Filter := GraphicFilter(TBitmap);
Button1.Caption:='BMP-Bild auswählen';
Button2.Caption:='EXE generieren';
Ende;
procedure TForm1.Button1Click(Sender: TObject);
beginnen
wenn OpenPictureDialog1.Execute dann
Edit1.Text:=OpenPictureDialog1.FileName;
Ende;
procedure TForm1.Button2Click(Sender: TObject);
var
HeadTemp:String;
beginnen
wenn FileExists(Edit1.Text) dann
beginnen
Application.MessageBox('BMP-Bilddatei existiert nicht, bitte erneut auswählen!','Message',MB_ICONINFORMATION+MB_OK)
Ausfahrt;
Ende;
HeadTemp:=ChangeFileExt(Edit1.Text,'.exe');
if ExtractRes('exefile','head',HeadTemp) dann
if Cjt_AddtoFile(Edit1.Text,HeadTemp) dann
Application.MessageBox('EXE-Datei erfolgreich generiert!','Message',MB_ICONINFORMATION+MB_OK)
anders
beginnen
if FileExists(HeadTemp) then DeleteFile(HeadTemp);
Application.MessageBox('EXE-Dateigenerierung fehlgeschlagen!','Message',MB_ICONINFORMATION+MB_OK)
Ende;
Ende;
Ende.
Wie wäre es damit? Es ist erstaunlich :) Machen Sie die Programmoberfläche schöner und fügen Sie einige Funktionen hinzu. Sie werden feststellen, dass es besser ist
Es wird nicht viel schlimmer sein als die Software, die registriert werden muss.