Dışardan procedure çalıştırmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
superco
Üye
Mesajlar: 68
Kayıt: 05 Haz 2005 06:47
Konum: Düzce

Dışardan procedure çalıştırmak

Mesaj gönderen superco »

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.
Allah herkesin sırtına kaldırabileceği kadar yük koyar
Kullanıcı avatarı
Asri
Kıdemli Üye
Mesajlar: 767
Kayıt: 16 Eyl 2003 09:54
Konum: istanbul

Mesaj gönderen Asri »

Merhaba,
Probleminizle ilgili kafama bir soru takıldı.
Siz bir dosyayı

Kod: Tümünü seç

  shellexecute(0,'open', pchar(paramstr(1)),'','',SW_NORMAL);
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
Öğrenmek ve öğretmek, akıntıya karşı yüzmek gibidir ilerleyemediğiniz taktirde gerilersiniz.
superco
Üye
Mesajlar: 68
Kayıt: 05 Haz 2005 06:47
Konum: Düzce

Mesaj gönderen superco »

S.A.

Tmediaplayer kullanıyorum.
Allah herkesin sırtına kaldırabileceği kadar yük koyar
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1527
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

aslında denemedim ama porg.çalışıyorsa, her yeni dosyayı runtime de create ettiğin yeni form ve Tmediaplayer la açabilirsin.
DeveloperToolKit

..::|YeşilMavi|::..
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
Kendi nickim ile ilk defa bir arkadaşıma yardımcı olmanın sevincini yaşıyorum. :lol:
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. :lol:

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.



İyi çalışmalar.
superco
Üye
Mesajlar: 68
Kayıt: 05 Haz 2005 06:47
Konum: Düzce

Mesaj gönderen superco »

S.A.

Yardımlarınız için çok sağolun arkadaşlar ama benim bahsettiğim olay birazcık daha farklı. Programı herseferinde kapatıp tekrar açmak değilde çalışan programın içindeki bir fonksiyona ulaşmam gerekiyor.

Yardımlarınız için tekrar sağolun.
Allah herkesin sırtına kaldırabileceği kadar yük koyar
abdulkadir
Kıdemli Üye
Mesajlar: 489
Kayıt: 13 Eyl 2003 09:10
Konum: istanbul
İletişim:

Mesaj gönderen abdulkadir »

bende buna benzer birsey yapmıstım


viewtopic.php?t=6629&highlight=

sevgiler.
Fikirleri Aktar
Kaynakları Dagıt
Ve
Yoldan Çekil
http://www.Leventler.com.tr
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
superco yazdı: Programı herseferinde kapatıp tekrar açmak değilde çalışan programın içindeki bir fonksiyona ulaşmam gerekiyor.
sizin tam olarak ne yapmak istediğinizi anlayamadım. Şöyle düşünün
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.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

superco yazdı:... çalışan programın içindeki bir fonksiyona ulaşmam gerekiyor.
İ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.

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.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

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. 8)

- Örneğimizde iki dosya adı vereyim.

Kod: Tümünü seç

C:\X.AVI 
D:\Y.AVI
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.

Kod: Tümünü seç

[ANA]
FILE=C:\X.AVI
- 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.

Kod: Tümünü seç

c:\demo\Proje1.EXE A.AVI
- 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...

Kod: Tümünü seç

  INIFiles, SysUtils, Windows, Messages,
DPR Dosya kısa zaten direkt yazıyorum...

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.
- Program Unit'indeki çalışma şu şekilde...
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;
Resim
Resim ....Resim
superco
Üye
Mesajlar: 68
Kayıt: 05 Haz 2005 06:47
Konum: Düzce

Mesaj gönderen superco »

S.A.

Cevaplarınız için teşekkürler arkadaşlar. Lakin benim kafam iyice karıştı :D

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
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
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);
yerine,

Kod: Tümünü seç

  Programimiz := FindWindow('OrnekProgramFormu', Nil);
ş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. :lol:

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

İyi çalışmalar.
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
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.
mrmcop hocamızın örneğinde biraz değişiklik yaparak.

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;

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.
superco
Üye
Mesajlar: 68
Kayıt: 05 Haz 2005 06:47
Konum: Düzce

Mesaj gönderen superco »

S.A.
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. :lol:
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.

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ış :D

Çok teşekkürler arkadaşlar araştırmam gereken konuyu buldum :)
Allah herkesin sırtına kaldırabileceği kadar yük koyar
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

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 :)
Resim
Resim ....Resim
Cevapla