Dışardan procedure çalıştırmak
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Dışardan procedure çalıştırmak
S.A.
Bir programın içindeki procedure'ü başka bir programdan nasıl çalıştırabilirim?
Mesela avi uzantılı dosyaları programla ilişkilendirince her avi dosyasına tıkladığımda aynı programdan bir tane daha açılıyor.Bunun yerine program açılırken kontrol yapıp eğer program açıksa çalışan programdaki "dosyaac" procedure'üne dosya adını gönderip açık olan programda aviyi nasıl yükleyebilirim.
Bir programın içindeki procedure'ü başka bir programdan nasıl çalıştırabilirim?
Mesela avi uzantılı dosyaları programla ilişkilendirince her avi dosyasına tıkladığımda aynı programdan bir tane daha açılıyor.Bunun yerine program açılırken kontrol yapıp eğer program açıksa çalışan programdaki "dosyaac" procedure'üne dosya adını gönderip açık olan programda aviyi nasıl yükleyebilirim.
Allah herkesin sırtına kaldırabileceği kadar yük koyar
Merhaba,
Probleminizle ilgili kafama bir soru takıldı.
Siz bir dosyayı
gibi bir şekilde mi yoksa forma Tmediaplayer componenti koyarak mı bu işi yapıyorsunuz.
Şu an nasıl yaptığınızı söylerseniz belki yardımcı olabilirim.
İyi çalışmalar.
___________________
ofenX
Probleminizle ilgili kafama bir soru takıldı.
Siz bir dosyayı
Kod: Tümünü seç
shellexecute(0,'open', pchar(paramstr(1)),'','',SW_NORMAL);
Şu an nasıl yaptığınızı söylerseniz belki yardımcı olabilirim.
İyi çalışmalar.
___________________
ofenX
Öğrenmek ve öğretmek, akıntıya karşı yüzmek gibidir ilerleyemediğiniz taktirde gerilersiniz.
Merhaba,
Kendi nickim ile ilk defa bir arkadaşıma yardımcı olmanın sevincini yaşıyorum.
Umarım işinize yarar. Benim bulduğum çözüm ilk yüklenen kopyayı kapatıp, yeni kopyalanan kopyanın çalışmasın devam etmesini sağlamak ve verilen parametreyi yüklemek.
Denediğim programa 1 ad. listbox, 1 ad pagecontrol, 1 ad buton 1 ad. Mediaplayer ekledim.
Programı çalıştırıp play butonuna basınca program avi yi çalıştırıyor.
Aşağıdaki kodu uygun yerlere atıp denerseniz. inşallah istediğinizi veriyordur.
Programın ismine superco verdiğinizi varsayıyorum.
Ben programda form1 in captionuna superco yazmışım dosya ismi de superco.exe dir. İsim farklı ile listboxtaki arama ayarını o isme göre yapın.
Api leri tam olarak bilmediğimden kulağımı biraz uzatarak göstermiş olabilirim.
İyi çalışmalar.
Kendi nickim ile ilk defa bir arkadaşıma yardımcı olmanın sevincini yaşıyorum.

Umarım işinize yarar. Benim bulduğum çözüm ilk yüklenen kopyayı kapatıp, yeni kopyalanan kopyanın çalışmasın devam etmesini sağlamak ve verilen parametreyi yüklemek.
Denediğim programa 1 ad. listbox, 1 ad pagecontrol, 1 ad buton 1 ad. Mediaplayer ekledim.
Programı çalıştırıp play butonuna basınca program avi yi çalıştırıyor.
Aşağıdaki kodu uygun yerlere atıp denerseniz. inşallah istediğinizi veriyordur.
Programın ismine superco verdiğinizi varsayıyorum.
Ben programda form1 in captionuna superco yazmışım dosya ismi de superco.exe dir. İsim farklı ile listboxtaki arama ayarını o isme göre yapın.
Api leri tam olarak bilmediğimden kulağımı biraz uzatarak göstermiş olabilirim.

Kod: Tümünü seç
unit supercou;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, MPlayer, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
MediaPlayer1: TMediaPlayer;
PageControl1: TPageControl;
Button1: TButton;
ListBox1: TListBox;
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
Atom : Word;
{ Public declarations }
end;
var
Form1: TForm1;
simdiki,birinci,ikinci,silinecek:thandle;
implementation
{$R *.dfm}
function EnumWindowsProc(Wnd: HWND; List: TStrings): Boolean; stdcall;
var
ParentWnd: HWND;
ExStyle: DWORD;
Caption: array [0..255] of Char;
begin
if IsWindowVisible(Wnd) then
begin
ParentWnd:=GetWindowLong(Wnd,GWL_HWNDPARENT);
ExStyle:=GetWindowLong(Wnd,GWL_EXSTYLE);
if ((ParentWnd=0) or (ParentWnd=GetDesktopWindow)) and
((ExStyle and WS_EX_TOOLWINDOW=0) or (ExStyle and WS_EX_APPWINDOW<>0)) and
(GetWindowText(Wnd,Caption,SizeOf(Caption))>0) then
begin
List.AddObject(Caption,Pointer(Wnd));
List.AddObject(inttostr(wnd),Pointer(Wnd));
end;
end;
Result:=True;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
GlobalDeleteAtom(atom);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
halt;
end;
procedure TForm1.FormActivate(Sender: TObject);
var
a,i:integer;
begin
a:=0;
simdiki:=getactivewindow ;
simdiki:=getnextwindow(simdiki ,GW_HWNDNEXT);
if GlobalFindAtom('PROGRAM_RUNNING') = 0 then
atom := GlobalAddAtom('PROGRAM_RUNNING')
else
begin
EnumWindows(@EnumWindowsProc,Integer(ListBox1.Items));
for i:=0 to listbox1.Count-1 do
begin
if (listbox1.Items[i]='superco') then
begin
if a=0 then begin birinci:=strtoint(listbox1.Items[i+1]); end;
a:=a+1;
if a=2 then
begin
ikinci:=strtoint(listbox1.Items[i+1]);
if ikinci=simdiki then silinecek:=birinci else silinecek:=ikinci ;
PostMessage(silinecek, WM_QUIT, 0, 0);
atom := GlobalAddAtom('PROGRAM_RUNNING');
end;
end;
end;
end;
with mediaplayer1 do
filename:=paramstr(1);
mediaplayer1.Open;
end;
end.
-
- Kıdemli Üye
- Mesajlar: 489
- Kayıt: 13 Eyl 2003 09:10
- Konum: istanbul
- İletişim:
Merhaba,
1 adet clock.avi
1 adet cool.avi dosyanız var. (İkisi de win xp de c:\windows ta var.)
siz clock.avi ye bastığınızda clock.avi çalışacak, siz de göreceksiniz. Clock.avi daha hafızadayken gidip Cool.avi ye çift tıklayacaksınız. Clock avi yerine bu defa Cool.avi çalışacak.
İstediğiniz bu ise yukarıda verdiğim program işinizi görür. Siz ikinci avi ye tıkladığınızda mecburiyetten o programın 2. kopyası hafızaya alınacak.
Procedure çalıştırmak demişsiniz. Ha ikincide ha birinci açılışta ne farkeder ki her ikisinde de aynı procedure var. Her ikisinde de aynı işi görüyor.
Bu şekilde işinizi görmüyorsa lütfen biraz daha açıklama yapabilir misiniz?
İyi çalışmalar.
sizin tam olarak ne yapmak istediğinizi anlayamadım. Şöyle düşününsuperco yazdı: Programı herseferinde kapatıp tekrar açmak değilde çalışan programın içindeki bir fonksiyona ulaşmam gerekiyor.
1 adet clock.avi
1 adet cool.avi dosyanız var. (İkisi de win xp de c:\windows ta var.)
siz clock.avi ye bastığınızda clock.avi çalışacak, siz de göreceksiniz. Clock.avi daha hafızadayken gidip Cool.avi ye çift tıklayacaksınız. Clock avi yerine bu defa Cool.avi çalışacak.
İstediğiniz bu ise yukarıda verdiğim program işinizi görür. Siz ikinci avi ye tıkladığınızda mecburiyetten o programın 2. kopyası hafızaya alınacak.
Procedure çalıştırmak demişsiniz. Ha ikincide ha birinci açılışta ne farkeder ki her ikisinde de aynı procedure var. Her ikisinde de aynı işi görüyor.
Bu şekilde işinizi görmüyorsa lütfen biraz daha açıklama yapabilir misiniz?
İyi çalışmalar.
İstediğini Interprocess communication ile yapabilirsin. Bu uygulamalar arası veri alışverişi sağlamada kullanılır veya belirli bir koşulda diğer uygulamadaki bir proc. çalıştırılabilir. Delphi\Demos\IpcDemos altında bir örnek mevcut.superco yazdı:... çalışan programın içindeki bir fonksiyona ulaşmam gerekiyor.
Bence daha kolay bir yöntem windows message'ları kullanmak. Global bir message yayınlarsın. Diğer uygulamada da message id'yi dinleyip, geldiğinde parametreden uygun değeri alırsın.
Merhaba...
- AVI uzantısına çift tıklandığında Windows Media Player yerine sizin yaptığınız projenin tetiklenmesi için Windows'a register edilmiş olduğunu bildirmişsiniz.
- Halen açık olan projenize bir Windows Mesajı ile tetiklenemiz mümkün ve bunu kullanıcaz. Fakat bu durum sadece tetikleme yaparak programa yeniden erişildiğini gösterecektir. Dosya adı transferi için başka yol bulmak gerekir. Örneğimizde program dizinindeki bir INI dosyasını kullanıcaz.
- Öncelikle kullanacağımız tetikleme mekanizmasını kuralım.
- Örneğimizde iki dosya adı vereyim. olsunlar.
- Programınıza yaptıracağınız ilk işlem, AVI dosya yolunu ve adını program dizinindeki belirleyeceğiniz -o da DOSYA.INI olsun- , bir INI dosyasına kaydettirip ondan sonra çalıştırmak.
- Bu bize araya insert gireceğimiz bir nokta teşkil edecek. Yani üçüncü tetikleme işlemi sırasında bu INI dosyası değişecek size sadece bu iniden yeniden oku şeklinde tek bir hamle kalacak.
- Bir AVI dosyasına basıldığında, Windows'a tanıttığınız formatta bir işlem yapılacaktır. Yani sizin projenizin yolu ve adını takip eden ilk parametre -siz aksini belirmemişseniz- dosya adı olacaktır.
- Programının ilk yapacağı şey, ParamStr(1) ile gelen AVI dosya yolunu her halukarda INI dosyaya yazmak olacak.
- Daha sonra programının bir kopyası çalışıyorsa şimdiki çalışan yeni kopya kendini imha edecek, ama imha öncesinde eski çalışan kopyaya bir mesaj yollayıp ini dosyadaki yeni dosya kaydını okuyup çalışmasını sağlaycak procedure'ü tetikleyecek.
- Buraya kadar anlaşıldı herhalde.
- İkinci çalışmayı tespit eden tekniklerden; ister GLOBALATOM belirle ister FORM ADINI arattır. Ben daha kolayıma gelen ikincisini kullanıcam.
- DPR dosyasındaki çalışma FORM createde de öncesinde olacağından ilk kopya çalışmasında sorun yaşamayı engeller nitelikte.
DPR Uses'ına şunlar eklenicek...
DPR Dosya kısa zaten direkt yazıyorum...
- Program Unit'indeki çalışma şu şekilde...
Type'ın üzerinde bir CONST tanımı yapıcaz. Bu özel mesajımız...
- AVI uzantısına çift tıklandığında Windows Media Player yerine sizin yaptığınız projenin tetiklenmesi için Windows'a register edilmiş olduğunu bildirmişsiniz.
- Halen açık olan projenize bir Windows Mesajı ile tetiklenemiz mümkün ve bunu kullanıcaz. Fakat bu durum sadece tetikleme yaparak programa yeniden erişildiğini gösterecektir. Dosya adı transferi için başka yol bulmak gerekir. Örneğimizde program dizinindeki bir INI dosyasını kullanıcaz.
- Öncelikle kullanacağımız tetikleme mekanizmasını kuralım.

- Örneğimizde iki dosya adı vereyim.
Kod: Tümünü seç
C:\X.AVI
D:\Y.AVI
- Programınıza yaptıracağınız ilk işlem, AVI dosya yolunu ve adını program dizinindeki belirleyeceğiniz -o da DOSYA.INI olsun- , bir INI dosyasına kaydettirip ondan sonra çalıştırmak.
Kod: Tümünü seç
[ANA]
FILE=C:\X.AVI
- Bir AVI dosyasına basıldığında, Windows'a tanıttığınız formatta bir işlem yapılacaktır. Yani sizin projenizin yolu ve adını takip eden ilk parametre -siz aksini belirmemişseniz- dosya adı olacaktır.
Kod: Tümünü seç
c:\demo\Proje1.EXE A.AVI
- Daha sonra programının bir kopyası çalışıyorsa şimdiki çalışan yeni kopya kendini imha edecek, ama imha öncesinde eski çalışan kopyaya bir mesaj yollayıp ini dosyadaki yeni dosya kaydını okuyup çalışmasını sağlaycak procedure'ü tetikleyecek.
- Buraya kadar anlaşıldı herhalde.
- İkinci çalışmayı tespit eden tekniklerden; ister GLOBALATOM belirle ister FORM ADINI arattır. Ben daha kolayıma gelen ikincisini kullanıcam.
- DPR dosyasındaki çalışma FORM createde de öncesinde olacağından ilk kopya çalışmasında sorun yaşamayı engeller nitelikte.
DPR Uses'ına şunlar eklenicek...
Kod: Tümünü seç
INIFiles, SysUtils, Windows, Messages,
Kod: Tümünü seç
Var
INIDosya : TINIFile; // Uses INIFiles
Programimiz : THandle;
begin
If ParamStr(1) <> '' then
begin
INIDosya := TINIFile.Create(ExtractFilePath(Application.ExeName)+'Dosya.INI');
INIDosya.WriteString('ANA', 'FILE', ParamStr(1));
INIDosya.Free;
end;
Programimiz := FindWindow('TOrnekProgramFormu', Nil);
If Programimiz <> 0 then
begin
SetForegroundWindow(Programimiz); // pencereyi öne aldık...
PostMessage(Programimiz, WM_USER +1234, 0, 0);
Application.Terminate; // ama daha önce yeni Dosyayı INI'ye attık.
end;
Application.Initialize;
Application.CreateForm(TOrnekProgramFormu, OrnekProgramFormu);
Application.Run;
end.
Type'ın üzerinde bir CONST tanımı yapıcaz. Bu özel mesajımız...
Kod: Tümünü seç
Const
TETIK = WM_USER +1234;
Kod: Tümünü seç
private
procedure TETIKCI(var Msg: TMessage);message TETIK;
procedure Calistir;
Kod: Tümünü seç
Procedure TOrnekProgramFormu.Calistir;
Var
INIDosya : TINIFile; // Uses INIFiles
begin
INIDosya := TINIFile.Create(ExtractFilePath(Application.ExeName)+'Dosya.INI');
// Deneme pojemde bir TLabel'a bu ismi yazdırdım. Sen TMediaPlayer'le ilgileneceksin..
Label1.Caption := INIDosya.ReadString('ANA', 'FILE', '');
INIDosya.Free;
end;
Kod: Tümünü seç
procedure TOrnekProgramFormu.FormCreate(Sender: TObject);
begin
Calistir();
end;
Kod: Tümünü seç
procedure TOrnekProgramFormu.TETIKCI(var Msg: TMessage);
begin
Calistir();
end;
S.A.
Cevaplarınız için teşekkürler arkadaşlar. Lakin benim kafam iyice karıştı
Video oynatıcı değilde mdi olarak çalışan rtf editörü olarak düşününsek mesela. Her yeni rtfye tıkladığımda yeni program değilde açık olan programa bir tane daha mdichild form yaratsa.
mrmcop hocam verdiğin örnek(beni biraz aşan bi konu anlamaya çalışıyorum) için teşekkürler sanırım aradığım şey.
Cevaplarınız için teşekkürler arkadaşlar. Lakin benim kafam iyice karıştı

Video oynatıcı değilde mdi olarak çalışan rtf editörü olarak düşününsek mesela. Her yeni rtfye tıkladığımda yeni program değilde açık olan programa bir tane daha mdichild form yaratsa.
mrmcop hocam verdiğin örnek(beni biraz aşan bi konu anlamaya çalışıyorum) için teşekkürler sanırım aradığım şey.
Allah herkesin sırtına kaldırabileceği kadar yük koyar
Merhaba,
mrmcop hocam sayenizde bir şeyler öğrenelim dedik. Sizin örneği denemeye çalışıyordum. Program çalıştığı gibi kapanıyordu. yerine,
şeklinde yaptım. O zaman labelin değiştiğini görüyorum. Ama avi lere her tıkladığımda bu defa project1.exe hafızada kalıyor.
Ben bir yanlışlık mı yapıyorum. Yoksa siz eksik mi göndermişsiniz?
Superco hocam, bakın şimdi itiraf ediyorsunuz bize bilgiyi eksik yazmışsınız. Her aviye tıklandığında bir mdichild form açsın deseydiniz. Daha farklı çalışırdık.
Neyse kısa günün karı :mrmcop hocamız sayesinde inifile dosyalarına yazma ve okumayı öğrendik.
İyi çalışmalar.
mrmcop hocam sayenizde bir şeyler öğrenelim dedik. Sizin örneği denemeye çalışıyordum. Program çalıştığı gibi kapanıyordu.
Kod: Tümünü seç
Programimiz := FindWindow('TOrnekProgramFormu', Nil);
Kod: Tümünü seç
Programimiz := FindWindow('OrnekProgramFormu', Nil);
Ben bir yanlışlık mı yapıyorum. Yoksa siz eksik mi göndermişsiniz?
Superco hocam, bakın şimdi itiraf ediyorsunuz bize bilgiyi eksik yazmışsınız. Her aviye tıklandığında bir mdichild form açsın deseydiniz. Daha farklı çalışırdık.

Neyse kısa günün karı :mrmcop hocamız sayesinde inifile dosyalarına yazma ve okumayı öğrendik.

İyi çalışmalar.
Merhaba,
gibi bir kodla istediğinize yakın bir şey alabilirsiniz. Ben form2 diye bir available form oluşturdum. 1 adet page control, 1 adet mediaplayer koydum. Normal form olarak çalışıyor. Ana formumuz active olmadığı için child olarak tanıtamadım. İnşallah mrmcop hocamız onu da sizin için ayarlar.
İyi çalışmalar.
mrmcop hocamızın örneğinde biraz değişiklik yaparak.superco yazdı:Video oynatıcı değilde mdi olarak çalışan rtf editörü olarak düşününsek mesela. Her yeni rtfye tıkladığımda yeni program değilde açık olan programa bir tane daha mdichild form yaratsa.
Kod: Tümünü seç
Procedure TOrnekProgramFormu.Calistir;
Var
INIDosya : TINIFile; // Uses INIFiles
child:tform2;
begin
INIDosya := TINIFile.Create('c:\silsup2\Dosya.INI');
// Deneme pojemde bir TLabel'a bu ismi yazdırdım. Sen TMediaPlayer'le ilgileneceksin..
Label1.Caption := INIDosya.ReadString('ANA', 'FILE', '');
child:=tform2.create(application);
child.Caption:=INIDosya.ReadString('ANA', 'FILE', '');
child.MediaPlayer1.FileName:=INIDosya.ReadString('ANA', 'FILE', '');
child.MediaPlayer1.Open ;
child.MediaPlayer1.Play;
child.Show;
INIDosya.Free;
end;
İyi çalışmalar.
S.A.
Yani öğrenmek istediğimin mdi formlarla alakası yok sadece örnek olarak vermiştim sorunum başlıktada yazdığı gibi dışardan procedure çalıştırmak onuda yapmanın en kolay yolu programa message yollamakmış
Çok teşekkürler arkadaşlar araştırmam gereken konuyu buldum
Yok hocam mdi formlarla ilgili bir sorunum yok. İlk başlarda benimde aklıma her seferinde isimleri tuttuğum dosyayı kontrol ettirmek geldi ama timerla sürekli dosya aç dosya kapa baya işlemci zamanından çalacak o yüzden sadece gerektiğinde procedure çalıştırmayı arıyordum. mrmcop ve coderlord ustalarda iki tavsiyede bulundular bende bunları araştırıyorum.ofenX yazdı:Superco hocam, bakın şimdi itiraf ediyorsunuz bize bilgiyi eksik yazmışsınız. Her aviye tıklandığında bir mdichild form açsın deseydiniz. Daha farklı çalışırdık.![]()
Yani öğrenmek istediğimin mdi formlarla alakası yok sadece örnek olarak vermiştim sorunum başlıktada yazdığı gibi dışardan procedure çalıştırmak onuda yapmanın en kolay yolu programa message yollamakmış

Çok teşekkürler arkadaşlar araştırmam gereken konuyu buldum

Allah herkesin sırtına kaldırabileceği kadar yük koyar
Arkadaşlar..
- Örnekler yeterince açık.
- Proje örneğini çalışır derlenmiş EXE de dahil 150kb'lık ZIP dosyayı server'e koydum. Kısa bir süre için tutucam sonra silicem.
- İndirip deneyin...
http://divxturk.divxforever.com/files/g ... ecenek.zip
- Örnekler yeterince açık.
- Proje örneğini çalışır derlenmiş EXE de dahil 150kb'lık ZIP dosyayı server'e koydum. Kısa bir süre için tutucam sonra silicem.
- İndirip deneyin...
http://divxturk.divxforever.com/files/g ... ecenek.zip
