Procedury...

0

Jak zadeklarowac procedure tak aby mozna jej bylo uzywac na kilku Formach?--take care,

Wodzu

0

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

0

Wodzu napisał:
Jak zadeklarowac procedure tak aby mozna jej bylo uzywac na kilku Formach?

  1. Uzyj biblioteki dll :)
  2. mozesz na zrobic to tak:

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

0

Dzieki Romantiko, nie chcialo mi sie pisac jak wsadzic procedure do klasy...--Pawel

Delphi6

0

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

0

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

0

Wodzu napisał:
Dzieki wam za odpowiedzi...:)
&gt
&gtWszystko 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

0

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

0

Wodzu napisał:

&gtI 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

&gtprocedure TForm1.Rameczka(Sender: TObject; Canvas: TCanvas; ClientWidth,ClientHeight: Integer ) ;

a pozniej gdzies nizej podac jej definicje np:

&gtprocedure 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

0

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

0

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

0

&gtA co do tych DLL, to myslisz ze jestem w stanie to pojac?:P
&gtbo ja mam watpliwosci;)

Mi sie jakos udalo :)

Pozdrawiam {hello} --LSD - Discover The New Way Of Thinking

0
  1. Romantiko (15:17), dobrze napisales, dales przyklad do tego co ja tylko opisalem bez przykladu (z lenistwa). Dzieki i wszystko OK.

  2. 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.

  1. Romantiko (15:51) chyba cos pomyliles, albo ja Cie nie zrozumialem. Jesli procedura ma byc widoczna na zewnatrz i nie byc czescia klasy formularza, wtedy jej deklaracja (tzn procedure Rameczka(parametry); musi byc w sekcji interface anie implementation, zas w implementation musi byc
    procedure Rameczka(parametry);
    begin
    tekst procedury
    end;

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

0

ups, spoznilem sie :((((

a co do dll-i to nie sa trudne, choc w prostych programach raczej zbyteczne IMHO--Pawel

Delphi6

0

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

0

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

0

Wyglada ze probowales skompilowac poleceniem Run (zielona strzalka'Play')

Uzyj Compile lub Build.

Kod na pierwszy rzut oka wyglada spoko.--Pawel

Delphi6

0

&gtexports * eksportuj procedurę
&gt Rameczka;

wydaje mi sie ze powinno byc

exports
Rameczka name 'Rameczka' ; *albo przez index

&gt
&gtNiestety to COS nie chce sie kompliowac gdyz wyskakuje taki komunikat:
&gt
&gt"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

0

Ok, skompilowalem tak jak radziliscie jednak nie pojawil mi sie zaden plik z rozszerzeniem DLL mam natomiast;
*.DPR
*.DOF
*.CFG

....? hm...--take care,

Wodzu

0

Wodzu napisał:
Ok, skompilowalem tak jak radziliscie jednak nie pojawil mi sie zaden plik z rozszerzeniem DLL mam natomiast;
&gt*.DPR
&gt*.DOF
&gt*.CFG
&gt
&gt....? 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

0

dzieki, juz znalazlem...;)--take care,

Wodzu

0

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

0

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...:(
&gt
&gtCo robie zle?

Spruboj wywalic z deklaracji stdcall

Pozdrawiam {hello} --LSD - Discover The New Way Of Thinking

0

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...:(
&gt
&gtCo 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

0
  1. Romantiko 23.05 16:37

exports moze byc bez name lub index. Name potrzebne jest jesli chcesz wyeksportowac procedure pod inna nazwa niz uzywales w dll-u.

  1. Romantiko 23.05 20:11

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

0

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

0

Wodzu napisał:

&gt
&gtNIE 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&ltbold&gt
Forma.Color:=clRed;
Exit;&lt/bold&gt
with Forma.Canvas do
begin
MoveTo(0,0);
Pen.Color:=$004A4A4A;
LineTo(&ltbold&gtForma.ClientWidth, Forma.ClientHeight&lt/bold&gt);
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

0

pq napisał:
&ltbold&gt
&gtForma.Color:=clRed;
&gtExit;&lt/bold&gt

mialo byc a nie &ltbold&gt

EDYCJA POSTOW PLEASE!!!!!!!!--Pawel

Delphi6

0

w ogole pochrzanilem z tymi znacznikami bolda {wstyd} . Prosze moderatora o posprzatanie--Pawel

Delphi6

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1