MP3

5 отговора 165 прегледа
#1

MP3

Kak da play-vam po vuzmojno nai-lesniq (i bezplaten) nachin MP3-ki???

I osven tova, da vi pitam, tukmo sum vuv foruma, nqkoi znae li kak moga da napravq na delphi sushtoto koeto se pravi na VB sus App.PrevInstance?

Merci

Отговор
в отговор на MP3 #2

Re: MP3

eto ti neshto free koeto az sym polzval kato komponent i raboti bezuprechno: [линк]


Отговор
в отговор на MP3 #3

Re: MP3

В отговор на:

I osven tova, da vi pitam, tukmo sum vuv foruma, nqkoi znae li kak moga da napravq na delphi sushtoto koeto se pravi na VB sus App.PrevInstance?



CreateMutex


Отговор
в отговор на MP3 #4

Re: MP3

unit unit1;

interface

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

type
TForm1 = class(TForm)
Procedure FormCreate(Sender: TObject);
private
MessageId: Integer;
{ Private declarations }
public
{ Public declarations }
end;

const
UniqueAppStr : PChar = 'Tova e unikalen string';

MI_FAIL_SUBCLASS = 1;
MI_FAIL_CREATE_MUTEX = 2;

var
Form1: TForm1;
MutHandle: THandle =0;
WProc: TFNWndProc = Nil;
MessageID:integer;
MIError: Integer = 0;

implementation


{$R *.DFM}

Function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint): Longint; stdcall;
begin

{ Ако е това съобщение... }
if Msg = MessageID then
begin
{ ако главния прозорец е минимайзнат, да се върне в нормално състояние }
if IsIconic(Application.Handle) then
begin
Application.MainForm.WindowState := wsNormal;
Application.Restore;
end;
SetForegroundWindow(Application.MainForm.Handle);
Result := 0;
end
{ В противен случай предай съобщение към предишната процедура с прозорци }
else
Result := CallWindowProc(WProc, Handle, Msg, wParam, lParam);
end;


Procedure TForm1.FormCreate(Sender: TObject);
begin
MessageID := RegisterWindowMessage(UniqueAppStr);
MutHandle := OpenMutex(MUTEX_ALL_ACCESS, False, UniqueAppStr);
if MutHandle = 0 then
begin
WProc := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC,Longint(@NewWndProc)));
{ Сигнализиране за неуспешен subclassing }
if WProc = Nil then
MIError := MIError or MI_FAIL_SUBCLASS;

MutHandle := CreateMutex(Nil, False, UniqueAppStr);
if MutHandle = 0 then
MIError := MIError or MI_FAIL_CREATE_MUTEX;
end else begin
{ Вече е стартиран един екземпляр на програмата }
ShowMessage('Вече е стартиран един екземпляр на програмата');
Application.Terminate;
end;
end;

end.

МОжеш да си разшириш Application като му добавиш нов метод с име примерно AppPrevInnstance : Boolean ;

Отговор
в отговор на MP3 #5

Re: MP3

Ето и друг вариант който ми дойде на ум ....не е много универсален но е кратък и разбираем

Това ти е "главния" юнит на програмата

program Previousе;

uses
Forms,
Windows,
Previous in 'Previous.pas' {Form1};

{$R *.res}
var
H : Thandle ;
begin
Application.Initialize;
H := FindWindow('TForm1','TestProgram') ;
if H <> 0 then begin
Application.MessageBox('Previous instance detected !','Error',MB_ICONERROR);
Application.Terminate ;
end;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Както забелязваш идеята е да извикаш API'to FindWindow и ако то намери прозорец от клас TForm1 със Caption-а на твоята форма то е много вероятно това да е именно същата програма.(в случая Caption-а на главната форма е 'TestProgram')
Метода ще създава проблеми ако ползваш еднакъв caption за различни програми - например Form1

Отговор
в отговор на Sury #6

Re: MP3

Това сега ли го измисли или по принцип така го правиш???
Много излишен код, subclassing, OpenMutex...

CreateMutex(NULL,true,"IceMutex");
if(GetLastError()==ERROR_ALREADY_EXISTS)
{

ShowMessage("Програмата вече е стартирана!");
return 0;
}

Това е на Билдер, ама лесно се преправя.
Слага се тука

begin
---->>> тука
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.


Отговор