Jak zadeklarowac procedure tak aby mozna jej bylo uzywac na kilku Formach?--take care,
Wodzu
Jak zadeklarowac procedure tak aby mozna jej bylo uzywac na kilku Formach?--take care,
Wodzu
unit unit1;
interface
procedure X;
implementation
procedure X;
begin
{..}
end;
//-------------
unit unit2;
uses unit1;
procedure Y
begin
X;
end;
mozna tez zrobic X czescia formularza1 i wtedy tez potrzeba uses, a odwolanie byloby Form1.X
(pisane z pamieci, moga byc bledy :( )--Pawel
Delphi6
Wodzu napisał:
Jak zadeklarowac procedure tak aby mozna jej bylo uzywac na kilku Formach?
unit Main ;
*cos tam
type
TFrmMain = class(TForm)
*cos tam
public procedure Procedurka(parametry) ;
end ;
var
FrmMain: TFrmMain ;
a pozniej w sekcji uses dodac (jasli masz formy w innych plikach) Main i odwolac sie do tej procedury tak:
FrmMain.Procedurka(parametry) ;
jesli masz wszystkie formy w jednym pliku to zadeklaruj procedure jako globalna w sekcji implementation
Pozrawiam {hello} --LSD - Discover The New Way Of Thinking
Dzieki Romantiko, nie chcialo mi sie pisac jak wsadzic procedure do klasy...--Pawel
Delphi6
pq napisał:
Dzieki Romantiko, nie chcialo mi sie pisac jak wsadzic procedure do klasy...
Czy cos zrobilem zle ? :) Sorka, ale nie widziauem tfoyego posta wczesniej, staralem sie odpowiedziec jak umialem najlepiej, jakbym widzial, to bym sie juz pewnie nie odzywal...
Pozdrawiam :) {hello} --LSD - Discover The New Way Of Thinking
Dzieki wam za odpowiedzi...:)
Wszystko to co opisaliscie mam zrobione tylko wlasnie nie wiem jak zadeklarowac prcedure jako GLOBALNA :-)
Badzcie tak dobrzy i napiszcie jak to zrobic;)--take care,
Wodzu
Wodzu napisał:
Dzieki wam za odpowiedzi...:)
>
>Wszystko to co opisaliscie mam zrobione tylko wlasnie nie wiem jak zadeklarowac prcedure jako GLOBALNA :-)
ja bym powiedzial ze po slowie implementation ale moge byc w bledzie :)
Pozdrawiam {hello} --LSD - Discover The New Way Of Thinking
To w takim razie powiedz mi co tutaj schrzanilem:)
Stworzylem sobie procedurke ktora ma za zadanie rysowac mi ramke wokol dowolnej formy, zadeklarowalem owo cos;) w ten sposob:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Obrazek;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
procedure Rameczka(Sender: TObject; Canvas: TCanvas; ClientWidth,ClientHeight: Integer );
end;
var
Form1: TForm1;
implementation
uses Unit2, Unit3, Unit4, Unit5;
{$R *.dfm}
procedure TForm1.Rameczka(Sender: TObject; Canvas: TCanvas; ClientWidth,ClientHeight: Integer );
begin
with Canvas do
begin
MoveTo(0, 0);
Pen.Color:=$004A4A4A;
LineTo(800, 0);
LineTo(800,600);
LineTo(600,0);
LineTo(0,0);
end;
end;
begin
//tutaj jakies tam dzialania
end.
I JAK TERAZ WYWOLAC OWA PROCEDURE W INNEJ FORMIE?
--take care,
Wodzu
Wodzu napisał:
>I JAK TERAZ WYWOLAC OWA PROCEDURE W INNEJ FORMIE?
Z tego co widze, to ta procedura jest w klasie Tform1
Oto co powinienes zrobic:
Zadeklarowac na po slowie implementation np tak
>procedure TForm1.Rameczka(Sender: TObject; Canvas: TCanvas; ClientWidth,ClientHeight: Integer ) ;
a pozniej gdzies nizej podac jej definicje np:
>procedure TForm1.Rameczka(Sender: TObject; Canvas: TCanvas; ClientWidth,ClientHeight: Integer );
begin
*jakis kod
end ;
w tym tez przypadku powinienes usunac deklaracje tej procedury z Tform1
A moya sugestia jest taka, zebys umiescil sobie ta procedurke w bibliotece dll, jak nie wiesz jak to sie robi, to poczytaj: http:*www.4programmers.net/delphi/dll.html
Uwierz mi, dll to naprawde przydatna rzecz :)
Pozdrawiam {hello}
--LSD - Discover The New Way Of Thinking
Wydaje mi sie (nie jestem pewny) ze wystarczyloby, jakbys przeczytal moj post z 15:11, poniewaz podalem ci tam, jak odwolywac sie do procedury umieszczonej w klasie.
Podzrawiam :) {hello} --LSD - Discover The New Way Of Thinking
Ok juz mi wyszlo, kwestia w tym ze sam nie wiedzialem jakie parametry nalezy podac przy wywolaniu procedury(buahahhaha :D ) no ale po kombinowalem i dziala to dla takiego oto wywolania:
Form1.Rameczka(Form5, Form5.Canvas, Form5.ClientHeight, Form5.ClientWidth);
A co do tych DLL, to myslisz ze jestem w stanie to pojac?:P
bo ja mam watpliwosci;)--take care,
Wodzu
>A co do tych DLL, to myslisz ze jestem w stanie to pojac?:P
>bo ja mam watpliwosci;)
Mi sie jakos udalo :)
Pozdrawiam {hello} --LSD - Discover The New Way Of Thinking
Romantiko (15:17), dobrze napisales, dales przyklad do tego co ja tylko opisalem bez przykladu (z lenistwa). Dzieki i wszystko OK.
Wodzu (15:40)
Inna forma musi w swoim unicie miec uses Unit1;
Ta forma nie moze byc w unicie2, 3, 4, 5, albo musisz odpowiedni unit tej formy wyrzucic z listy uses Unitu1, bo Unity nie moga sie do siebie wzajemnie odwolywac przez uses, rowniez 'przez posrednikow'.
I teraz w unicie tej formy ktora ma uzyc Rameczka napisz
Form1.Rameczka(...
UWAGA: nie TForm1.Rameczka !!!!
Zeby bylo jasne: unit, w ktorym wywolujesz procedure Rameczka musi miec na swojej liscie uses nazwe unitu, w ktorym jest tekst procedury Rameczka, nie na odwrot.
tak jak u mnie o 15:09. I wtedy tak samo: unit, w ktorym wywolujesz procedure Rameczka musi miec na swojej liscie uses nazwe unitu, w ktorym jest tekst procedury Rameczka.
A wywolanie z jest po prostu Rameczka (bez Form1 bo tym razem rameczka nie jest czescia klasy formularza. zaprogramowales ja proceduralnie a nie obiektowo :)) )
--Pawel
Delphi6
ups, spoznilem sie :((((
a co do dll-i to nie sa trudne, choc w prostych programach raczej zbyteczne IMHO--Pawel
Delphi6
pq:
ad 1. Ok, spoko :) Luzik, myslalem ze tym trzykropkiem mnie za cos skarciles :)
ad 3. Nie wiedzialem o tym, ale pewnie masz racje, nigdy nie potrzebowalem globalnych procedur, a jak juz to robilem je w klasach, stad pewnie ten blad :) Dzieki :)
Nie mam wiecej pytan ;)
Pozdrawiam {hello}
--LSD - Discover The New Way Of Thinking
pq, nie szkodzi ze sie spozniles, jestem Ci wdzieczny za to ze raczysz mi pomagac;)
OkeJ Szanowni Panowie;)
Poczytalem o tych DLLach i stworzylem cos takiego:
library Project1;
uses
Graphics;
procedure Rameczka(Sender: TObject; Canvas: TCanvas; ClientWidth,ClientHeight: Integer );
begin
with Canvas do
begin
MoveTo(0, 0);
Pen.Color:=$004A4A4A;
LineTo(800, 0);
LineTo(800,600);
LineTo(600,0);
LineTo(0,0);
end;
end;
exports // eksportuj procedurę
Rameczka;
begin
end.
Niestety to COS nie chce sie kompliowac gdyz wyskakuje taki komunikat:
"Cannot debug project unless a host application is defined. Use the Run|Parameters... dialog box"
Rozumiem, ze mam teraz wskazac project do ktorego owa biblioteka ma nalezec? Ale czy jak to zrobie, to bede mial mozliwosc uzywania jej w innych programach?
Ehh..cos tu chyba nie gra... hmm... --take care,
Wodzu
Wyglada ze probowales skompilowac poleceniem Run (zielona strzalka'Play')
Uzyj Compile lub Build.
Kod na pierwszy rzut oka wyglada spoko.--Pawel
Delphi6
>exports * eksportuj procedurę
> Rameczka;
wydaje mi sie ze powinno byc
exports
Rameczka name 'Rameczka' ; *albo przez index
>
>Niestety to COS nie chce sie kompliowac gdyz wyskakuje taki komunikat:
>
>"Cannot debug project unless a host application is defined. Use the Run|Parameters... dialog box"
nadus Ctrl+F9 zamiast samego F9
Pozdrawiam {hello} --LSD - Discover The New Way Of Thinking
Ok, skompilowalem tak jak radziliscie jednak nie pojawil mi sie zaden plik z rozszerzeniem DLL mam natomiast;
*.DPR
*.DOF
*.CFG
....? hm...--take care,
Wodzu
Wodzu napisał:
Ok, skompilowalem tak jak radziliscie jednak nie pojawil mi sie zaden plik z rozszerzeniem DLL mam natomiast;
>*.DPR
>*.DOF
>*.CFG
>
>....? hm...
No to dziwne, u mnie dziala bezproblemowo. Zrobiles wszystko przy towrzeniu tak jak bylo powiedziane w FAQ ?
Pozdrawiam {hello} --LSD - Discover The New Way Of Thinking
dzieki, juz znalazlem...;)--take care,
Wodzu
Niestety mimo postepowania zgodnie z tym co pisaliscie, po skompilowaniu biblioteki oraz zadeklarowaniu w programie procedury z tej biblioteki dostaje "Acces Violation" przy uruchomieniu programu...:(
Co robie zle?--take care,
Wodzu
Wodzu napisał:
Niestety mimo postepowania zgodnie z tym co pisaliscie, po skompilowaniu biblioteki oraz zadeklarowaniu w programie procedury z tej biblioteki dostaje "Acces Violation" przy uruchomieniu programu...:(
>
>Co robie zle?
Spruboj wywalic z deklaracji stdcall
Pozdrawiam {hello} --LSD - Discover The New Way Of Thinking
Wodzu napisał:
Niestety mimo postepowania zgodnie z tym co pisaliscie, po skompilowaniu biblioteki oraz zadeklarowaniu w programie procedury z tej biblioteki dostaje "Acces Violation" przy uruchomieniu programu...:(
>
>Co robie zle?
Aaaaha, jeszcze jedno, jesli rysujesz po formie, to podejrzewam (chociaz moze to jest niekonieczne) ze nalezaloby umiescic jakas 'standardowa' forme jako parametr procedury np:
procedure procedurka (... ; Forma: TForm ; ...) ;
begin
*nie jestem pewny, ale wtedy chyba Canvas jako parametr bedzie zbedny
with Forma.Canvas do
begin
*jakies instrukcje
end ;
//jakies instrukcje
end ;
--LSD - Discover The New Way Of Thinking
exports moze byc bez name lub index. Name potrzebne jest jesli chcesz wyeksportowac procedure pod inna nazwa niz uzywales w dll-u.
Ja bym niekonieczne wywalal stdcall. Musisz jednak ujednolicic sposob przekazywania parametrow (register, pascal, stdcall, safecall, cdecl) zeby byla taka sama w dll-u (w deklaracji procedury) i w programie (w wywolaniu procedury).
register (defaultowa Delphi) jest b.szybka, bo jesli moze, to przekazuje parametry w rejestrach
cdecl, pascal, stdcall i safecall zawsze uzywaja stosu, jednak na innych zasadach, dodatkowo safecall robi jakies dodatkowe rzeczy ktorych nie rozumiem;)
W dll-ach pod winda w dobrym tonie jest uzywanie stdcall lub safecall, wtedy dll jest dostepny dla programow nie-delphi.
Jesli dalej sa klopoty, podaj jak (statycznie czy dynamicznie) odwolujesz sie do procedury z glownego programu, ewentualnie podrzuc troche kodu. --Pawel
Delphi6
Pomysl z parametrem jest dobry ale i tak to nie dziala...
Efekt nie-dzialania jest taki:
1.Program uruchamia sie
2.Program rysuje np. linie za pomoca procedury z DLL'a
I do tej pory wszystko OK ale gdy teraz zamykam aplikacje to wyskakuje mi Acces Violation.....
Pokaze Ci jak ostatenicze wyglada moja biblioteka i Unit
library biblioteczka;
uses
Windows,
Messages,
SysUtils,
Variants,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
ExtCtrls,
StdCtrls,
Obrazek;
procedure Rameczka(Forma :TForm); stdcall;
begin
with Forma.Canvas do
begin
MoveTo(0,0);
Pen.Color:=$004A4A4A;
LineTo(ClientWidth, ClientHeigth);
end;
end;
exports // eksportuj procedurę
Rameczka;
begin
end.
W usesach dalem wszystkie standardowe myslac ze moze po prostu wczesniej czegos nie dodawalem...
a tak wyglaeda Unit;
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
procedure Rameczka(Forma :TForm); stdcall;
external 'C:\biblioteczka.dll';
type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormPaint(Sender: TObject);
begin
Rameczka(Form1);
end;
end.
NIE rozumiem dlaczego program przy zamknieciu sie wykrzacza:(
--take care,
Wodzu
Wodzu napisał:
>
>NIE rozumiem dlaczego program przy zamknieciu sie wykrzacza:(
Ja tez nie za bardzo. Ale udalo mi sie choc troche zlokalizowac problem. Najpierw przerobilem ladowanie dll-a na dynamiczne i nie pomoglo.
Wiec przerobilem library tak:
procedure Rameczka(Forma :TForm); stdcall;
begin<bold>
Forma.Color:=clRed;
Exit;</bold>
with Forma.Canvas do
begin
MoveTo(0,0);
Pen.Color:=$004A4A4A;
LineTo(<bold>Forma.ClientWidth, Forma.ClientHeight</bold>);
end;
Bez drugiej poprawki sie nie kompilowalo. A pierwsza 'poprawka' pomogla. Czyli problem jest zwiazany z Twoim rysowaniem a nie z dll-em jako takim. Dalsze eksperymenty wykazaly, ze linijka z ustawieniem koloru jest kluczowa: bez niej dziala ok. Ale dlaczego? Nie mam pojecia....--Pawel
Delphi6
pq napisał:
<bold>
>Forma.Color:=clRed;
>Exit;</bold>
mialo byc a nie <bold>
EDYCJA POSTOW PLEASE!!!!!!!!--Pawel
Delphi6
w ogole pochrzanilem z tymi znacznikami bolda {wstyd} . Prosze moderatora o posprzatanie--Pawel
Delphi6
hmm... albo ja czegos nie zrozumialem albo to dalej nie dziala...
Jesli kompiluje biblioteke z Twoimi dwoma poprawkami to OK forma zmienia kolor(tylko hmm..po co?) ale linia sie nie rysuje bo dales tam "Exit;" i przeciez po tej instrukcji program wyskakuje z tej procedury. Wiec po co dalsza czesc?
Jesli uruchamiam program tylko z druga poprawka albo ze zmiana koloru formy bez Exit; i druga poprawka to linai sie rysuje, forma zmienia kolor ale przy zamknieciu program dalej sie wykrzacza...
Wiec moze mi pokazasz kod po ktorym u Ciebie to zadzialalo...bo u mnie dalej nic nie chodzi tak jak powinno {glowa}
--take care,
Wodzu