Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.31;
Скачать: CL | DM;

Вниз

clipboard->WAVE->file   Найти похожие ветки 

 
Dema-X   (2004-10-18 09:46) [0]

Как можно звук находядящийся в clipbord"е занести в переменную в Delphi
c последющей записью в файл,в справке я не нашел даже примерного описания в каком типе можно хранить
звуки подскажите пожалуйста


 
ЮЮ ©   (2004-10-18 10:10) [1]

А как, интересно, он в clipbord попал? У тебя clipbord со встроенным микрофоном?


 
Dema-X   (2004-10-18 11:12) [2]

а ты в программе звукозавись посмотри пункт копировать а clipbbrd прошерсти на CF_WAVE так вот и попадает :)


 
KilkennyCat ©   (2004-10-18 12:05) [3]


> Dema-X   (18.10.04 11:12) [2]

ну так ты и ответил на свой вопрос... осталось только создать ресурс и сделать в нем лоадфромклипбоард


 
Dema-X   (2004-10-18 18:39) [4]


> KilkennyCat ©   (18.10.04 12:05) [3]
>
> > Dema-X   (18.10.04 11:12) [2]
>
> ну так ты и ответил на свой вопрос... осталось только создать
> ресурс и сделать в нем лоадфромклипбоард

В этом то и проблема,я не знаю что создавать,никаких классов TWAVE я не встречал Ж(


 
GuAV ©   (2004-10-18 22:04) [5]

uses Clipbrd, MMSystem;

var h: HGLOBAL; P: Pointer;
begin
 if not Clipboard.HasFormat(CF_WAVE) then Exit;
 Clipboard.Open;
 try
   h := Clipboard.GetAsHandle(CF_WAVE);
   if h = 0 then Exit;
   P := GlobalLock(h);
   if P <> nil then
   try
     // P указвыает на звук
     // юзаем как хотим
     PlaySound(P, 0, SND_MEMORY);
     // закончили работу
   finally
     GlobalUnlock(h);
   end;
 finally
   Clipboard.Close;
 end;
end;


 
GuAV ©   (2004-10-18 22:30) [6]

Точнее можно и без Open/Close, это в TClipboard автоматически делается.
var h: HGLOBAL; P: Pointer;
begin
 if not Clipboard.HasFormat(CF_WAVE) then Exit;
 h := Clipboard.GetAsHandle(CF_WAVE);
 if h = 0 then Exit;
 P := GlobalLock(h);
 if P <> nil then
 try
   PlaySound(P, 0, SND_MEMORY);
 finally
   GlobalUnlock(h);
 end;
end;


 
GuAV ©   (2004-10-18 22:44) [7]

то есть [6] зря написал - не работает потому что закрывает clipboard сразу же. а [5] - работает, проверил.


 
KilkennyCat ©   (2004-10-19 01:26) [8]


> Dema-X   (18.10.04 18:39) [4]


а TStream встречал?


 
Dema-X   (2004-10-19 06:55) [9]


> KilkennyCat ©   (19.10.04 01:26) [8]
>
> > Dema-X   (18.10.04 18:39) [4]
>
>
> а TStream встречал?

Встречал только описания не видел поэтому использовать не получатся приложение валится...


 
Dema-X   (2004-10-19 07:32) [10]


> GuAV ©  

Ну не совсем то что надо,ваш пример показывает как проиграть а как зогнать этот звук в глобальную переменныю?


 
GuAV ©   (2004-10-19 14:34) [11]

P^ это УЖЕ глобальная переменная которая нужна. В файл например сохранить надо ? тогда так:
var h: HGLOBAL; P: Pointer;
begin
if not Clipboard.HasFormat(CF_WAVE) then Exit;
Clipboard.Open;
try
  h := Clipboard.GetAsHandle(CF_WAVE);
  if h = 0 then Exit;
  P := GlobalLock(h);
  if P <> nil then
  try
    // P указвыает на звук
    // юзаем как хотим
    with TFileStream.Create("c:\test.wav", fmCreate) do
    try
      WriteBuffer(PWAVEHDR(P).lpData, PWAVEHDR(P).dwBufferLength);
    finally
      Free;
    end;
    // закончили работу
  finally
    GlobalUnlock(h);
  end;
finally
  Clipboard.Close;
end;
end;


 
Dema-X   (2004-10-19 18:30) [12]

иак в том то и дело что P^ это лишь указатель на ресурс  а нужно чтоюы в тип типа tbimap или др


 
GuAV ©   (2004-10-19 23:11) [13]

Dema-X   (19.10.04 18:30) [12]
иак в том то и дело что P^ это лишь указатель на ресурс  а нужно чтоюы в тип типа tbimap или др


Не совсем понял.

надо куда нибуть поместить то что потом пойдёт в файл ?
тогда заменить TFileStream на TMemoryStream, сделать его глобальной переменной. Или без TSream - через GetMem и Move

надо сделать что-то доступным после выполнения процедуры ?
скопировать. например, через move.

где в дельфи класс TWave ? видимо, его действительно нет в составе дельфи. Чей то готовый вероятно можно найти, используя поисковую систему.


 
GuAV ©   (2004-10-20 01:00) [14]

а ещё AVIGetFromClipboard есть, нужно только найти объявления для дельфи или переписать с сишных.


 
Dema-X   (2004-10-20 09:00) [15]


> GuAV ©   (19.10.04 23:11) [13]
> Dema-X   (19.10.04 18:30) [12]
> иак в том то и дело что P^ это лишь указатель на ресурс
>  а нужно чтоюы в тип типа tbimap или др
>
> Не совсем понял.

Ну короче массив создать который находится в памяти и к каждому элементу можно обращатся как к звуку.а P это POINTER - указатель скопировали одно запомнил скопировали другое забыл 1 и запомнил 2.


 
GuAV ©   (2004-10-20 12:52) [16]


>
> Ну короче массив создать который находится в памяти и
> к каждому элементу можно обращатся как к звуку.а P это
> POINTER - указатель скопировали одно запомнил
> скопировали другое забыл 1 и запомнил 2.

скопировать, например, через move в массив из указателей

GetMem(A[I], Size);
Move(P, A[I], Size);


или в список.

GetMem(P1, Size);
Move(P, P1, Size);
List.Add(P1);


или через список TMemoryStream;

M:=TMemoryStream.Create;
try
 M.WriteBuffer(P, Size);
 List.Add(M);
except
 M.Free;
 raise;
end;


 
GuAV ©   (2004-10-20 13:29) [17]

Короче, вот работоспособный пример.
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Button1: TButton; // вставить звук в список
   Button2: TButton; // проиграть все звуки из списка
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

uses Clipbrd, MMSystem, Contnrs;

{$R *.dfm}

var List: TObjectList;

procedure TForm1.Button1Click(Sender: TObject);
var h: HGLOBAL; P: Pointer; S: TMemoryStream;
begin
if not Clipboard.HasFormat(CF_WAVE) then Exit;
Clipboard.Open;
try
 h := Clipboard.GetAsHandle(CF_WAVE);
 if h = 0 then Exit;
 P := GlobalLock(h);
 if P <> nil then
 try
   S := TMemoryStream.Create;
   try
     S.WriteBuffer(PWAVEHDR(P).lpData, PWAVEHDR(P).dwBufferLength);
     List.Add(S);
   except
     S.Free;
     raise;
   end;
 finally
   GlobalUnlock(h);
 end;
finally
 Clipboard.Close;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var I: Integer;
begin
 for I := 0 to List.Count - 1 do
   PlaySound(TMemoryStream(List[I]).Memory, 0, SND_MEMORY);
end;

initialization
 List := TObjectList.Create;
finalization
 List.Free;
end.



Страницы: 1 вся ветка

Текущий архив: 2004.10.31;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.046 c
4-1096390666
hgd
2004-09-28 20:57
2004.10.31
Скажите как нажать кнопку в другой открытой программе


14-1097516324
Ломброзо
2004-10-11 21:38
2004.10.31
Документооборот


1-1098092719
Kolan
2004-10-18 13:45
2004.10.31
"Масив" Зарезервированных слов


3-1096621509
msguns
2004-10-01 13:05
2004.10.31
MSACCESS. Ошибка синтаксиса


4-1096284308
Rifo
2004-09-27 15:25
2004.10.31
Отключение монитора.