Форум: "Начинающим";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];
ВнизWM_COPYDATA Найти похожие ветки
← →
NaRuTo © (2008-03-09 19:51) [0]Привет мастерам Delphi! У меня страшная проблема...Я уже месяц работаю над тем как бы мне открыть файлы со с помощью своей программы... Есть ParamStr, но если открывать сразу несколько файлов он абсолютно бесполезен....Он начинает по очереди открывать добавлять в список каждый мной открытый файл...Если выделить ну где-т допустим файла 4...Будет заметно мерцание в списке с открытыми файлами...Есть ли какое-то другое средство....Работающее быстрее..Т.е эти файлы будут добавлены одним разом в один с список..А не постоянно проверять запущено ли приложение, а затем WM_COPYDATA
← →
Loginov Dmitry © (2008-03-09 20:06) [1]Мдя...
← →
trubin © (2008-03-09 20:14) [2]Ничего не понял, какой список?
Особенно круто следующее
> А не постоянно проверять запущено ли приложение, а затем
> WM_COPYDATA
причем тут WM_COPYDATA
← →
NaRuTo © (2008-03-09 20:44) [3]Вот код!
← →
NaRuTo © (2008-03-09 20:46) [4]
program player;
uses
Windows,
Messages,
SysUtils,
Variants,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
ExtCtrls,
StdCtrls,
ComCtrls,
main in "main.pas" {PogiForm},
splash in "splash.pas" {SplashForm},
playlist in "playlist.pas" {PlaylistForm},
video in "video.pas" {Form1};
{$R *.res}
var
i: integer;
hMainForm: HWND;
copyDataStruct: TCopyDataStruct;
ParamString: string;
WParam, LParam: integer;
Count: Integer;
begin
hMainForm := FindWindow("TPogiForm",nil);
if hMainForm = 0 then begin
SplashForm:= TSplashFOrm.Create(Application);
SplashForm.Show;
SplashForm.Update;
Application.Title := "POGi - Media Player";
Application.CreateForm(TPogiForm, PogiForm);
Application.CreateForm(TPlayListForm, PlayListForm);
Application.CreateForm(TForm1, Form1);
for i := 1 to ParamCount do begin
PlayListForm.OpenFileMusic(ParamStr(i));
end;
repeat
Application.ProcessMessages;
until SplashForm.CloseQuery;
SplashForm.Hide;
SplashForm.Free;
Application.Run;
end
else begin
ParamString := "";
for i := 1 to ParamCount do
begin
// caieoeaaai ana ia?aiao?u a iaio no?ieo n ?acaaeeoaeyie ?13
ParamString := ParamString + ParamStr(i) + #13;
end;
// nicaaai caienu oeia TCopyDataStruct
CopyDataStruct.lpData := PChar(ParamString);
CopyDataStruct.cbData := Length(ParamString);
CopyDataStruct.dwData := 0;
WParam := Application.Handle;
LParam := Integer(@CopyDataStruct);
// ionueaai niiauaiea WM_COPYDATA aeaaiiio ieio ioe?uoiai i?eei?aiey
SendMessage(hMainForm, WM_CopyData, WParam, LParam);
Application.Terminate;
end;
end.
В главной форме:procedure TPogiForm.AddFile(FileName: String; param: Integer);
var
Caption: String;
Time: String;
Name: String;
i: integer;
Fil: String;
Artist, Title: String;
begin
Name:= FileName;
for i:= 1 to Length(FileName) - 1 do begin
Name[i]:= FileName[i];
end;
delete(Name,Length(FileName),Length(FileName));
if ParamCount = 1 then begin
PlayListForm.List.Clear;
PlayListForm.List.Items.Add(IntToStr(PlayListForm.List.Items.Count) + ". " + ExtractFileName(ChangeFileExt(Name,"")));
nummusic:= 0;
end;
PlayListForm.CountMusic[PlayListForm.List.Items.Count - 1]:= Name;
PlayListForm.TimeCount[PlayListForm.List.Items.Count - 1]:= PlayListForm.GetTimeMusic(PlayListForm.CountMusic[PlayListForm.List.Items.Count - 1]);
Label2.Caption:= PlayListForm.List.Items.Strings[PlayListForm.List.Items.Count - 1];
if Param = ParamCOunt then
PlayStream(PlayListForm.CountMusic[PlayListForm.List.Items.Count - 1]);
PlayListForm.List.ItemIndex:= PlayListForm.List.Items.Count - 1;
PlayListForm.ScrollList.Size:= PlayListForm.List.Count;
PlayListForm.ScrollList.Position:= PlayListForm.List.Count;
PlayListForm.PositionScroll:= PlayListForm.List.Count;
end;
procedure TPogiForm.CopyData(var Msg: TWMCopyData);
var
ParamStr: string;
CopyDataStructure: TCopyDataStruct;
i: integer;
len: integer;
begin
inc(param);
CopyDataStructure := Msg.CopyDataStruct^;
ParamStr := "";
len := CopyDataStructure.cbData;
for i := 0 to len - 1 do
begin
ParamStr := ParamStr + (PChar(CopyDataStructure.lpData) + i)^;
end;
i := 0;
while not (Length(ParamStr) = 0) do
begin
if isDelimiter(#13, ParamStr, i) then
begin
AddFile(ParamStr,param);
ParamStr := Copy(ParamStr, i + 1, Length(ParamStr) - i - 1);
end;
inc(i);
end;
param:= 0;
inherited;
end;
← →
Loginov Dmitry © (2008-03-09 20:59) [5]> Вот код!
Круто!
А вопрос в чем все-таки?
← →
NaRuTo © (2008-03-09 21:33) [6]
> Loginov Dmitry © (09.03.08 20:59) [5]
А вопрос в чем все-таки?
> NaRuTo © (09.03.08 19:51)
> Есть ли какое-то другое средство....Работающее быстрее.
← →
trubin © (2008-03-09 21:54) [7]Я так понял тормоза именно в получении инфы из файла? Если так, то можно логику изменить, сначала получать инфу, а затем заполнять список. Юзеру в это время чтобы не скучал - или курсор в виде часиков, или прогресс бар показывать. Или я не правильно понял.
← →
trubin © (2008-03-09 21:54) [8]Я так понял тормоза именно в получении инфы из файла? Если так, то можно логику изменить, сначала получать инфу, а затем заполнять список. Юзеру в это время чтобы не скучал - или курсор в виде часиков, или прогресс бар показывать. Или я не правильно понял.
← →
VirEx © (2008-03-10 10:15) [9]Не понял в чем проблема, но логика такая:
Первый запуск (предположим): Pogi.exe 1.mp3 2.mp3 3.mp3 4.mp3
1. Запускается программа
2. Через ParamStr() заполняется список файлов
3. Первый файл начинает проигрываться
Второй запуск (При этом предыдущую копию программы не закрываем):
Pogi.exe 5.mp3 6.mp3 7.mp3 8.mp3
1. Запускается вторая копия программы
2. Через ParamStr() заполняется список файлов
3. Если предыдущая копия программы запущена (найден хэндл через FindWindow) значит посылаем первой копии через SendMessage список файлов по одному "5.mp3 6.mp3 7.mp3 8.mp3"
4. Закрываемся
1. Первая копия программы "ловит" название файла и добавляет его в список
2. Если список был пустой, то начинаем проигрывать этот файл, если уже проигрывается какой-либо файл то ничего не делаем (он уже в списке)
При этом не нужно отправлять содержимое файла, достаточно только его имя и место расположения.
← →
VirEx © (2008-03-10 10:53) [10]
WParam := Application.Handle;
for i := 1 to ParamCount do begin
CopyDataStruct.lpData := PChar(ParamStr(i));
CopyDataStruct.cbData := Length(CopyDataStruct.lpData);
CopyDataStruct.dwData := 0;
LParam := Integer(@CopyDataStruct);
SendMessage(hMainForm, WM_CopyData, WParam, LParam);
end;
----procedure TPogiForm.CopyData(var Msg: TWMCopyData);
var
ParamStr: string;
CopyDataStructure: TCopyDataStruct;
begin
// заполняем ParamStr
while length(ParamStr)<Msg.CopyDataStruct^.cbData do
ParamStr:=ParamStr+(Pchar(Msg.CopyDataStruct^.lpData)+length(ParamStr))^;
// если в списке нет, то добавляем
if PlayListForm.List.IndexOf(ParamStr)=-1 then PlayListForm.List.Add(ParamStr);
...
end;
а зачем у тебя PlayListForm.List.Clear ?
ты очищаешь список и заново всё запихиваешь? Нафги?
← →
Leonid Troyanovsky © (2008-03-10 11:46) [11]
> VirEx © (10.03.08 10:53) [10]
> // заполняем ParamStr
> while length(ParamStr)<Msg.CopyDataStruct^.cbData do
> ParamStr:=ParamStr+(Pchar(Msg.CopyDataStruct^.lpData)+length(ParamStr))^;
Что это.
--
Regards, LVT.
← →
VirEx © (2008-03-10 11:56) [12]
> [11] Leonid Troyanovsky © (10.03.08 11:46)
Это извращение без дополнительной переменной-счетчика
← →
Leonid Troyanovsky © (2008-03-10 12:11) [13]
> VirEx © (10.03.08 11:56) [12]
> Это извращение без дополнительной переменной-счетчика
Видим, что извращение.
SetString, RTFM.
--
Regards, LVT.
← →
NaRuTo © (2008-03-10 18:55) [14]
> VirEx © (10.03.08 10:53) [10]
А что толку та в ParamStr() действует только если самому прописывать много параметров....А если просто щёлкаешь на нескольких файлах открыть ситуация остаётся прежней
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.006 c