Arsip: Ubah TApplication jadi yg diinginkan, gimana ?

 
user image
more 13 years ago

avatar_eng

---): giniloh...... kalo kita buat aplikasi di Delphi trus langsung di simpan kan otomatis nama / ipclassnamenya akan mengikuti nama form, contoh : form name : Form1, berarti ipclassnamenya = TForm1 nah kalo tuh program dijalankan kemudian kita lihat pake program WinSight32 nya Delphi/C++ maka akan terlihat IpClassName dan WindowCaption nya, nah ternyata ipclassname program kita tuh jadinya ada dua yaitu TForm1 dan TApplication, nah yang mau aku tanyakan adalah bagimana kita mengganti IpClassName nya program kita dari TApplication menjadi nama yang kita inginkan ? pleaseeee helpme mr mr yang lagi baca , karena aku pernah dapat virus yang membunuh semua program yang aku buat pake delphi, pertama kukira si pembuat virus tau nama programku sehingga dapat di kill eh ternyata hanya program yang di buat peke delphi doang....... gimana tuh.................... mr ? siapapun anda yg kebetulan lewat and tau tolong ya .............! -----from Cinmi_boy-----i am detektif from ternate, you now ?---------- --------tank's------------------------------------------------------------------
user image
more 13 years ago

mat_koder

aku pernah dapat virus yang membunuh semua program yang aku buat pake delphi,
Mendingan basmi itu virus daripada susah-susah ngerubah cara Delphi membuat aplikasi... Kasus yg pernah aku temui malah sebaliknya : virus yg dibuat dengan Delphi dapat dibunuh dengan mengenali TApplication dan bersama dengan identifier lain..... Anyway........... Microsoft sudah menentukan bhw Window class name hanya dapat dibuat pd waktu inisialisasi WindowsClass structure ( dan tentunya harus di-register sebelum dipakai dalam create windows) dan tidak dapat dirubah pada saat runtime. untuk TForm descendant , kita bisa rubah Window class name (dari cara default Delphi) pada saat creating windowsclass structure dengan meng-override procedure CreateParams . namun untuk TApplication tidak dpt dgn cara ini. Satu-satunya cara yg terpikirkan oleh saya adalah dengan mengkompile ulang RTL librarynya si Delphi khususnya dalam unit Forms.pas Copy Forms.pas dari default folder dan satukan dengan folder applikasi anda sehingga bentuk dpr-nya seperti berikut: ( penting: jangan merubah nama forms.pas menjadi nama lain )

uses
  Unit1 in 'Unit1.pas' {Form1},
  Forms in 'Forms.pas';
edit Forms.pas ( yg ada di folder aplikasi) dan tambahkan kode:

procedure TApplication.CreateHandle;
var
  TempClass: TWndClass;
  SysMenu: HMenu;
begin
  // tambahkan baris dibawah ini , bila perlu anda bikin random data spy
  // tdk sama setiap kali di-run
  WindowClass.lpszClassName := 'MyAppClass'; 
  ....
Jalankan aplikasi dan test lagi dengan WinSight32
user image
more 13 years ago

DelphiExpert

ada yg ngomong "You can't change the class name of the TApplication window. Even Delphi32.exe uses that class name. You can change the default class names of your forms, however, by overriding the CreateParams method and setting Params.WinClassName" http://coding.derkeiler.com/Archive/Delphi/borland.public.delphi.nativeapi/2003-11/0764.html tapi logikanya bisa, namun anda harus bersedia ribet dengan TApplication reference (unit Forms.pas) langkah pertama "mungkin" membuat turunan langsung dari TApplication, langkah kedua merubah semua variable, classname yg merujuk ke TApplication specifik. langkah selanjutnya compile & override Forms.dcu dlm direktory Lib, langkah selanjutnya resiko anda tanggung sendiri, sebab dlm Forms.pas begitu banyaaak yg berurusan ama Application global variable, sehingga kalau tidak cermat, besar kemungkinan terjadi error / crash :mrgreen:
user image
more 13 years ago

DelphiExpert

aha... setelah dipelajari dengan seksama, cara ini mungkin bisa anda gunakan:

program Project1;
uses 
  Forms, 
  Unit1 in 'Unit1.pas' {Form1}; 
{$R *.RES} 
Type 
  TMyNewApp = class (TApplication);  // TMyNewApp is new application classname
begin 
  Application.Free; // Application telah dibuat sebagai default, hancurkan dulu...
  Application:= TMyNewApp.Create (Nil); // buat instance baru dng reference turunan dari TApplication (TMyNewApp)
  Application.Initialize; 
  Application.CreateForm(TForm1, Form1); 
  Application.Run; 
end.
user image
more 13 years ago

mat_koder

postingan saya terdahulu telah dikoreksi dan di edit. Penjelasan: Ternyata TApplication Window handle creation tidak melalui controls.pas tetapi ada di Forms.pas. Ternyata juga Nama windowclass tidak di copy dari nama class (TApplication atau turunannya sekalipun di free and recreate from TApplication descendant ) tetapi di "hardcode" dengan string "TApplication" ( anda bisa lihat di structure WindowClass - global variable). Sehingga mengubah kode di Controls.pas ( pada saat CreateParams ) maupun dengan melakukan turunan dari TApplication tetep aja nongol 'TApplication" di WinSight32.
user image
more 13 years ago

DelphiExpert

secara struktural anda "benar-benar" tidak bisa merubah application classname. satu-satunya cara adalah mengganti lpszClassName dalam record WindowClass (tagWNDCLASSA packed record) sayangnya "global" variabel WindowClass yg didalamnya ada field .lpszClassName bersifat local dlm unit Forms.pas saja. setelah kita trace, variable WindowClass "kemungkinan" cuma dlm method TApplication.CreateHandle; untuk kita bisa "replace" struktur yg ada dengan cara membuat baru (tidak perlu compile ulang RTL)

unit CustomApplication;
interface
uses Forms;
type
  TCustomApplication = class(TApplication)
  public
    constructor Create(const NewApplicationClass: string = ''); reintroduce; virtual;
    procedure CreateHandle; // override static method
  end;
implementation
var
  WindowClass: TWndClass = (
    style: 0;
    lpfnWndProc: @DefWindowProc;
    cbClsExtra: 0;
    cbWndExtra: 0;
    hInstance: 0;
    hIcon: 0;
    hCursor: 0;
    hbrBackground: 0;
    lpszMenuName: nil;
    lpszClassName: 'TNewApplication'); // --> hardcode, ganti disini atau gunakan constructor utk mengganti!
  
constructor TCustomApplication.Create(const NewApplicationClass: string); 
begin
  // set newapplicationclass name terlebih dahulu jika bukan string kosong yg dimasukkan
  if NewApplicationClass <> '' then WindowClass.lpszClassName:= NewApplicationClass;  
  inherited Create(nil);
end;
{ copy dari Forms.pas, not tested.
   mudah-mudahan tidak ada penggunaan yg merujuk ke local Forms.pas variables. }
procedure TCustomApplication.CreateHandle;
var
  TempClass: TWndClass;
  SysMenu: HMenu;
begin
  if not FHandleCreated
{$IFDEF MSWINDOWS}
    and not IsConsole then
{$ENDIF}
{$IFDEF LINUX}
    then
{$ENDIF}
  begin
{$IFDEF LINUX}
    FObjectInstance := WinUtils.MakeObjectInstance(WndProc);
{$ENDIF}
{$IFDEF MSWINDOWS}
    FObjectInstance := Classes.MakeObjectInstance(WndProc);
{$ENDIF}
    WindowClass.lpfnWndProc := @DefWindowProc;
    if not GetClassInfo(HInstance, WindowClass.lpszClassName, TempClass) then
    begin
      WindowClass.hInstance := HInstance;
      if Windows.RegisterClass(WindowClass) = 0 then
        raise EOutOfResources.Create(SWindowClass);
    end;
    FHandle := CreateWindowEx(0, WindowClass.lpszClassName, PChar(FTitle),
      WS_POPUP or WS_CAPTION or WS_CLIPSIBLINGS or WS_SYSMENU
      or WS_MINIMIZEBOX,
      GetSystemMetrics(SM_CXSCREEN) div 2,
      GetSystemMetrics(SM_CYSCREEN) div 2,
      0, 0, 0, 0, HInstance, nil);
    FHandleCreated := True;
    SetWindowLong(FHandle, GWL_WNDPROC, Longint(FObjectInstance));
    if NewStyleControls then
    begin
      SendMessage(FHandle, WM_SETICON, 1, GetIconHandle);
      SetClassLong(FHandle, GCL_HICON, GetIconHandle);
    end;
    SysMenu := GetSystemMenu(FHandle, False);
    DeleteMenu(SysMenu, SC_MAXIMIZE, MF_BYCOMMAND);
    DeleteMenu(SysMenu, SC_SIZE, MF_BYCOMMAND);
    if NewStyleControls then DeleteMenu(SysMenu, SC_MOVE, MF_BYCOMMAND);
  end;
end;
penggunaannya:

program Project1;
 
uses 
  Forms, 
  CustomApplication, // add our CustomApplication.pas
  Unit1 in 'Unit1.pas' {Form1}; 
 
{$R *.RES} 
 
begin 
  Application.Free; // Application telah dibuat secara default, hancurkan dulu...
 
  
  Application:= TCustomApplication.Create ('MyNewAppClass'l); // buat instance baru dng reference turunan dari TApplication
 
  Application.Initialize; 
  Application.CreateForm(TForm1, Form1); 
  Application.Run; 
end.
silahkan coba, moga-moga berhasil :mrgreen:
user image
more 13 years ago

DelphiExpert

walah ngga' bisa juga... :mrgreen: terlalu banyak variable private yg digunakan! 1. FObjectInstance 2. FHandle 3. FHandleCreated akhir kata, satu-satunya cara adalah dengan cara: 1. buat project baru, simpan. 2. copy Forms.pas satu folder dengan project baru tsb. 3. add to uses list dlm unit1.pas 4. ganti WindowClass.lpszClassName const (line: 7289 - CG2007)

var
  WindowClass: TWndClass = (
    style: 0;
    lpfnWndProc: @DefWindowProc;
    cbClsExtra: 0;
    cbWndExtra: 0;
    hInstance: 0;
    hIcon: 0;
    hCursor: 0;
    hbrBackground: 0;
    lpszMenuName: nil;
    lpszClassName: 'TNewDelphiApp'); // --> ganti dng nama baru
5. compile, sehingga "new" Forms.pas pun tercompile --> Forms.dcu 6. untuk memastikan tutup delphi terlebih dahulu sebelum: 7. copykan "new" Forms.dcu ke directory "lib" delphi anda, override! Done!
user image
more 13 years ago

ImanD

xixiixx akhirnya pada intinya sama juga dengan @mat_koder WindowClass.lpszClassName edited from Forms.pas SEMANGAT !!!
user image
more 13 years ago

avatar_eng

----): wah....wah...ruar biasa meeeen..............! tapi.....sorry ya, gue nanya lagi nih......boleh kan ?? soalnya masih ada yg mengganjal nih dari jawabannya, terutama yg ini nih: DelphiExpert := 3. add to uses list dlm unit1.pas ; ginama caranya tuh ya ? untuk langkah 1,2 udah Ok, Form.pas_nya udah di copy di folder yang sama dengan project gue, trus selanjutnya gimana tuh ? cara add nya itu loh yg aku ngga' tau .....he...he...he.... tinggal cara itu aja yg gue harapin, soalnya untuk cara yg lain : {---- Application.Free; // Application telah dibuat secara default, hancurkan dulu... Application:= TCustomApplication.Create ('MyNewAppClass'l); -----} ga' berhasil alias TApplication_nya masih nongol2 aja tuh..... pleaseeee helpme ya.......! --tank's form Cinmi_boy--I am Detektif from Ternate City !, you now ?!.----
user image
more 13 years ago

DelphiExpert

@avatar_eng: maksudnya "pastikan" unit Forms ada dalam uses project anda (defaultnya emang udah ada) :mrgreen: seperti ini (default delphi project):

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, -->> tuh ada Forms dlm uses list
  Dialogs,
Telah saya coba, ternyata cukup copy Forms.pas ke dlm 1 direktori dng project anda, ganti WindowClass.lpszClassName const (line: 7289 - CG2007), misal:

var
  WindowClass: TWndClass = (
    style: 0;
    lpfnWndProc: @DefWindowProc;
    cbClsExtra: 0;
    cbWndExtra: 0;
    hInstance: 0;
    hIcon: 0;
    hCursor: 0;
    hbrBackground: 0;
    lpszMenuName: nil;
    lpszClassName: 'TNewDelphiApp'); // --> ganti dng nama baru 
compile & jalankan project anda, refresh WinSight32... dan hooopla... aplikasi kita telah menggunakan TNewDelphiApp class name! :mrgreen:
more ...
  • Pages:
  • 1
  • 2
Share to

Random Topic

Local Business Directory, Search Engine Submission & SEO Tools FreeWebSubmission.com SonicRun.com