Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2015, 12:36   #11
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Цитата:
Для разных форматов картинок нужно использовать tBitMap, или есть что-нибудь более универсальное?
TGraphic

Код:
Var Img: TGraphic;
Begin
Img:=TBitmap.Create;
...
Img:=TJPEGImage.Create;
...
ResourceSpace вне форума Ответить с цитированием
Старый 26.07.2015, 13:07   #12
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Спасибо, а объект какого класса способен воспринимать музыку или, например, *.doc?

TObject?
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 26.07.2015, 13:49   #13
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Цитата:
музыку или, например, *.doc?
TMemoryStream
ResourceSpace вне форума Ответить с цитированием
Старый 26.07.2015, 16:34   #14
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от Алексей_2012 Посмотреть сообщение
Здравствуйте! Ребят, возможно ли, например, в файл записей записать картинку или музыку?

Вот например:
Код:
type
zap=record
kartinki: array of TbitMap;
muzik: array of ...;
end;

var 
f: file of zap;
w:zap;
Сложности в том, что так писать нельзя, что если я хочу использовать динамический массив? Не буду же я ограничиваться массивом в 1000, например, записей у одной w.записи? (kartinki: array [1..65350]of TBitmap; ) и возможно ли хранить не только JPG и BMP форматы?
Автор, не водись с тем, кто сказал что так писать нельзя. Этот человек 100% Сишник. Я так пишу уже 14 лет и все программы работают по сей день.

Код:
type
 TMyRecord  = packed record
    kartinki: array of TBitMap;
    muzik: array of TMemoryStream; // как тебе посоветовали
end;
а теперь использование

Код:
var Rec : TMyRecord;
     i : integer;
begin
   SetLength(Rec.Kartinki, 12); // создаём 12 картинок
   SetLength(Rec.muzik, 4); // и четыре музыки

   // работа с картинками
   kartinki[0] := TBitMap.Create;
   kartinki[0].LoadFromFile('C:\images\чучело.bmp');
   kartinki[1] := TBitMap.Create;
   kartinki[1].LoadFromFile('C:\images\мутант.bmp');
  .....
   // работа с музыкой
   muzik[0] := TMemoryStream.Create;
   muzik[0].LoadFromFile('C:\muzic\Rammstein\Engel.mp3');
  .....



// чистим за собой картинки
 for i:=0 to length(Rec.kartinki)-1 do
 if Asssigned(Rec.kartinki[i]) then
 Rec.kartinki[i].Free;

// чистим за собой музыку
 for i:=0 to length(Rec.muzik)-1 do
 if Asssigned(Rec.muzik[i]) then
 Rec.muzik[i].Free;

// чистим за собой массив
 Finalize(Rec.kartinki);
 Finalize(Rec.muzik);

end;
Цитата:
ВТорой вопрос не менее важен для меня, возможно ли хранить музыку РАЗЛИЧНЫХ форматов в типизированном файле?
можно ! Я бы делал вот так

Код:
var  myfile : TFileStream;
      music : TFileStream;

var  FileHeader : packed record 
        signature  : array[0..3] of char; // сигнатура твоего типа, чтобы отличать
        count  : integer; // число файлов
      end;

var  BlockHeader : packed record 
        mode : array[0..3] of char; // тип файла   
        size : int64; // размер файла
      end;
begin
   myfile := TFileStream.Create('C:\Хранилище\База_музыки.dmp', fmCreate);
   StrPLCopy(FileHeader.signature, 'MYMZ',4); // сигнатура "my muzic" :d
   FileHeader.count := 2; // запишем две разные мелодии
   // пишем заголовок файла
   myfile.Write(FileHeader, sizeof(FileHeader));


   music := TFileStream.Create('C:\muzic\Rammstein\Engel.mp3', fmOpenRead);
   StrPLCopy(BlockHeader.mode, 'MP3 ',4); // формат
   BlockHeader.size := music.size; // формат
   // пишем заголовок текущей мелодии
   myfile.Write(BlockHeader, sizeof(BlockHeader));
   // и саму мелодию
   myfile.CopyFrom(music, BlockHeader.size);
   music.Free;
  
   // вторая мелодия

   music := TFileStream.Create('C:\muzic\Гнатюк\Барабан был плох - Барабанщик Лох.WAV', fmOpenRead);
   StrPLCopy(BlockHeader.mode, 'WAVE',4); // формат
   BlockHeader.size := music.size; // формат
   // пишем заголовок текущей мелодии
   myfile.Write(BlockHeader, sizeof(BlockHeader));
   // и саму мелодию
   myfile.CopyFrom(music, BlockHeader.size);
   music.Free;

  // всё, у тебя база с двумя мелодиями твоего формата.  :)

   myFile.Free;
end;
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 31.07.2015, 14:20   #15
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Спасибо!

РЕбят, нигде не могу найти описание методов классов TFileStream и TMemoryStream
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 31.07.2015, 14:42   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Шутишь?
http://docs.embarcadero.com/products...ileStream.html
http://docs.embarcadero.com/products...oryStream.html
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.07.2015, 15:07   #17
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Нет, не шучу, но не очень понимаю в английском, поэтому и спросил. Думал есть русский аналог.

А можно ли оперировать данными упираясь только в TmemoryStream? Например для просмотра возможностей составил простейшую программу по записи выбранного файла в файл записей, а так же чтение из файла первой записи, но, почему-то, не сработало...

Код:
type
  zap = record
    mass: TMemoryStream;
  end;
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  w: zap;
  f: file of zap;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var s: string;
begin

  s := ExtractFilePath(ParamStr(0)) + 'new_file.txt';

  assignfile(f, s);

  if not FileExists(s) then Rewrite(f);

  Reset(F);
  seek(f, 0);

  ShowMessage(IntToStr(FileSize(f)));
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  CloseFile(F);
end;

procedure TForm1.Button1Click(Sender: TObject); 
 // ÷òåíèå   
    èç ôàéëà
begin
  Seek(f, 0);
  read(f, w);

  w.mass:=TMemoryStream.Create();
  w.mass.SaveToFile(ExtractFilePath(ParamStr(0)));

  w.mass.free;
end;

procedure TForm1.Button2Click(Sender: TObject);     
   //çàïèñü â
 òèïèçèðî
 âàííûé ôàéë
begin
  if not OpenDialog1.Execute then Exit;


  w.mass := TMemoryStream.Create();
  w.mass.LoadFromFile(OpenDialog1.FileName);
  write(F, w);
  w.mass.Free;
end;
from dark to light)

Последний раз редактировалось Stilet; 31.07.2015 в 15:34.
Алексей_2012 вне форума Ответить с цитированием
Старый 31.07.2015, 15:43   #18
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Автор, не водись с тем, кто сказал что так писать нельзя. Этот человек 100% Сишник. Я так пишу уже 14 лет и все программы работают по сей день.
проблема TC не в заполнении ОТДЕЛЬНОЙ записи(record) (в приведенном примере)
а в ТИПИЗИРОВАННОМ файле по такой записи
f: file of zap;
ОДНУ запись заполнить можно КАК угодно, а вот записать/прочитать файл записей заранее НЕИЗВЕСТНОГО формата.
И НЕ ОДНУ картину (звук) в файл!!!
Код:
f: TFileStream;
m: TMemoryStream;
Код:
bitmap.SaveToStream(m);
s:=m.Size;
f.Write(s, sizeof(s)); // что потом правильно прочитать мы должны ЗНАТЬ сколько нам НАДО читать!!!!
f.copyFrom(m, s);
И так для КАЖДОЙ картинки(звука/....)!!!! (то бишь циклом!!!)
сначала по числу картинок в записи (и чтобы знать сколько картинок было(и будет) в записи)
т.е. это число(количество картинок в записи) тоже НАДО писать в файл(TfileStream.Write(...)
а потом читать и устанавливать размеры(setLength)
потом по числу записей (ну здесь как обычно при чтении можно проверять конец файла(потока))
и не забывать по ТЕКУЩУЮ позицию (m.position).

Код:
f.read(s, sizeof(s));// вспоминаем (узнаем) а сколько же нам надо прочитать что картинка получилась вся
m.CopyFrom(f, s);// и читем столько сколько надо!!
bitmap.LoadFromStream(m);//получаем картинку
ну и опять цикл по записи (числу картинок в данной записи)
цикл по записям (по их числу или до конца потока).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 31.07.2015 в 15:56.
evg_m вне форума Ответить с цитированием
Старый 31.07.2015, 15:48   #19
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Думал есть русский аналог.
Ну есть конечно, но наверное не такой подробный: http://pro.dtn.ru/delphi-net/file3.html
Цитата:
можно ли оперировать данными упираясь только в TmemoryStream?
Ну можно. Но смотря что ты понимаешь под словом "оперировать". Stream это массив байт.
Цитата:
assignfile(f, s);
Рекомендую этот рудимент выкинуть в пользу TFileStream
Цитата:
по записи выбранного файла в файл записей
Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses  contnrs,
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;

type

  { TZap }

  TZap=class
    private
      Streams:TObjectList;
    public
      procedure Add(FileName:String);
      procedure Save(FileName:String);
      procedure Load(FileName:String);
      constructor Create;
      destructor Destroy; override;
  end;

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  with TZap.Create do begin
    Add('d:\1\an_absence.dbf');
    Add('d:\1\an_catalogue.dbf');
    Save('d:\1\Stream');
    Load('d:\1\Stream');
    Destroy;
  end;
end;

{ TZap }

procedure TZap.Add(FileName: String);
begin
  with TMemoryStream(Streams[Streams.Add(TMemoryStream.Create)]) do begin
    LoadFromFile(FileName);
    Position:=0;
  end;
end;

procedure TZap.Save(FileName: String);
var i,n:integer;
begin
  with TFileStream.Create(FileName,fmCreate) do begin
    for i:=0 to Streams.Count-1 do begin
      n:=TMemoryStream(Streams[i]).Size;
      WriteDWord(n);
      CopyFrom(TMemoryStream(Streams[i]),n);
    end;
    free;
  end;
end;

procedure TZap.Load(FileName: String);
var i:integer;  ms:TMemoryStream; fs:TFileStream;
begin
 Streams.Clear;
 fs:=TFileStream.Create(FileName,fmOpenRead);
 repeat
  try
    i:=fs.ReadDWord;
    ms:=TMemoryStream(Streams[Streams.Add(TMemoryStream.Create)]);
    ms.CopyFrom(fs,i);
  except
    break;
  end;
 until true;
 fs.Free;
end;

constructor TZap.Create;
begin
  inherited Create;
  Streams:=TObjectList.create(true);
end;

destructor TZap.Destroy;
begin
  inherited Destroy;
  Streams.Free;
end;

end.
Угадал я твои ожидания?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.08.2015, 21:53   #20
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Stilet, как всегда-огромное спасибо, пытаюсь разобраться. На абстрактном уровне представления как это все работает пытаюсь представить потоки с работой стринглиста. Точнее сравнить их ...в общем сказал как смог .
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хранение БД (картинки) Sashams93 Общие вопросы Delphi 16 24.04.2013 17:31
Хранение БД в одном файле D_E_N БД в Delphi 3 18.07.2009 14:01
Упорядоченное хранение в файле NSvirus Паскаль, Turbo Pascal, PascalABC.NET 1 03.06.2009 12:04
хранение данных в файле (dc++) AsabeasT Общие вопросы Delphi 2 27.03.2009 11:57
изменение музыки и картинки при запуске windos XP veter_s_morya Windows 4 09.06.2008 14:43