AGB  ·  Datenschutz  ·  Impressum  







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

loadfile aus TMemoryStream

Ein Thema von bluescreen25 · begonnen am 21. Feb 2008 · letzter Beitrag vom 24. Feb 2008
 
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#14

Re: loadfile aus TMemoryStream

  Alt 24. Feb 2008, 08:03
Moin,

hier ein Strukturansatz für das Ladeproblem:

Delphi-Quellcode:
unit DemoFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TDemoForm = class(TForm)
    SkinButton: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    SkinPath: string;
    SkinList: TStrings;
    SkinStream: TStream;
  end;

var
  DemoForm: TDemoForm;

implementation

{$R *.dfm}

uses
  FileCtrl;

const
  SKIN_EXTENSIONS = '*.jpg;*.bmp';

type
  TSkinItem = class
    FOffset: Int64;
    FSize: Int64;
  public
    constructor Create(offset, size: Int64);
    property Offset: Int64 read FOffSet;
    property Size: Int64 read FSize;
  end;

constructor TSkinItem.Create(offset, size: Int64);
begin
  inherited Create;
  FOffset := offset;
  FSize := size;
end;

function GetFiles(const dir, masks: string; s: TStrings = nil): Integer;
begin
  with TFileListBox.CreateParented(HWND(HWND_MESSAGE)) do
  try
    Mask := masks;
    Directory := dir;
    FileType := [ftArchive];
    Result := Items.Count;
    if Assigned(s) then
      s.Assign(Items);
  finally
    Free;
  end;
end;

procedure LoadSkins(const SkinPath, Extensions: string;
    SkinList: TStrings; SkinStream: TStream);
var
  i: Integer;
  totalSize: Int64;
  s: TStream;
begin
  totalSize := 0;
  with SkinList do
    for i := 0 to Pred(Count) do
      Objects[i].Free;
  GetFiles(SkinPath, Extensions, SkinList);
  with SkinList do
    for i := 0 to Pred(Count) do
    begin
      s := TFileStream.Create(Strings[i], fmOpenRead or fmShareDenyWrite);
      try
        Objects[i] := TSkinItem.Create(totalSize, s.Size);
        SkinStream.CopyFrom(s, 0);
        Inc(totalSize, s.Size);
      finally
        s.Free;
      end;
    end;
end;

procedure TDemoForm.FormCreate(Sender: TObject);
begin
  if (ParamCount = 0) or not FileExists(ParamStr(1))
    then GetDir(0, SkinPath)
    else SkinPath := ParamStr(1);
  SkinPath := IncludeTrailingPathDelimiter(SkinPath);
  SkinList := TStringList.Create;
  SkinStream := TMemoryStream.Create;
  LoadSkins(SkinPath, SKIN_EXTENSIONS, SkinList, SkinStream);
end;

procedure TDemoForm.SkinButtonClick(Sender: TObject);
begin
  if SelectDirectory('Select SkinPath', 'C:\', SkinPath) then
    LoadSkins(SkinPath, SKIN_EXTENSIONS, SkinList, SkinStream);
end;

end.
Ich würde eine Klasse entwerfen, welche die hier gezeigte Funktionalität kapselt.

Freundliche Grüße
  Mit Zitat antworten Zitat
 


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 02:59 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