Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.031 c
1-1098255088
BillyJeans
2004-10-20 10:51
2004.10.31
Как отловить окончание изменения TrackBar


1-1097843076
SSGuest
2004-10-15 16:24
2004.10.31
Как в DBGrid е сделать такую штуку...


14-1097750932
TUser
2004-10-14 14:48
2004.10.31
Интересно, как такое можно сделать


1-1098084343
NewDelpher
2004-10-18 11:25
2004.10.31
Точки останова


3-1096884693
WondeRu
2004-10-04 14:11
2004.10.31
FireBird: port 3050





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский