Delphi - podział programu na moduły, bądz pliki dołączone

0

Witam

Pisze pewien program, ale zorientowałem się że się powoli gubię w kodzie dlatego chciałbym go sobie podzielić na mniejsze części już wykorzystałem biblioteki Dll ale z pewna rzeczą mam już kłopot, nie chciałbym przedstawiać całego programu żeby nie zaciemnić problemu pozwolę sie posłużyć przykładem. Dodam jeszcze że program jest związany z tworzeniem grafiki Smile

Mamy taki oto fragment kodu, linie pomiędzy gwiazdkami chciałbym umieścić najlepiej w jakimś module lub bibliotece nie znajdującym się w główmy pliku projektu (.pas), ale niestety nie wiem jak wyczerpałem swoje zdolności i dlatego zwracam się do szanownych programistów o pomoc.

Kod:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);

  private
  procedure rysuj;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  counter:integer;
  curid:integer;
  tab:array[0..50] of tpoint;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
tab[1].X:=20;
tab[1].Y:=20;
tab[2].X:=100;
tab[2].Y:=100;
end;

{*************************************}
procedure tform1.rysuj;
var i:integer;
begin
paintbox1.canvas.Brush.color:=clblack;
paintbox1.Canvas.FillRect(clientrect);
for i:=1 downto 0 do begin
 if i>0 then begin
 paintbox1.canvas.Pen.color:=clgray;
 paintbox1.canvas.Pen.Width:=1;
 paintbox1.Canvas.Rectangle(tab[i].X,tab[i].Y,tab[i+1].X,tab[i+1].Y);
 end;
end;
end;
{*************************************}

procedure TForm1.Button1Click(Sender: TObject);
begin

{*************************************}
PaintBox1.Canvas.Brush.Color:=clWhite;
PaintBox1.Canvas.Rectangle(10,10,50,50);
{*************************************}

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
rysuj;
end;

end.

Szybko uczę się na przykładach więc jeśli było by to możliwe to chętnie poprosiłbym o zaprezentowanie rozwiązania w postaci kodu.

0
maxmad napisał(a)

Szybko uczę się na przykładach więc jeśli było by to możliwe to chętnie poprosiłbym o zaprezentowanie rozwiązania w postaci kodu.

Pewnie jak to zwykle bywan a tym forum nie dostane odpowiedzi na swój post i nie będę wiedział czy Ci
nawet pomogłem, siedząc chwilę i pisząć gotowy kod żebyś miał przykład. Samemu nie kombinowałeś.

Kod głównego Unitu (tutaj ma nazwę Unit1):

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    PaintBox1: TPaintBox;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
  public
  end;

var
  Form1 : TForm1;
  counter :integer;
  curid : integer;
  tab : array[0..50] of TPoint;


implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
tab[1].X:=20;
tab[1].Y:=20;
tab[2].X:=100;
tab[2].Y:=100;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Rysuj_1(PaintBox1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Rysuj_2(PaintBox1);
end;
end.

A tutaj kod drugiego Unitu, który tworzysz w menu File -> New -> Unit.
Nie bardzo potrafiłem sobie poradzić bez odwołania się do Form1, bo
funkcje korzystają z tablicy (tab) z głownego unitu oraz z ClientRect.

unit Unit2;

interface

uses
ExtCtrls, Graphics;

procedure Rysuj_1(NazwaPaintBoxa : TPaintBox);
procedure Rysuj_2(NazwaPaintBoxa : TPaintBox);

implementation

uses Unit1;

procedure Rysuj_1(NazwaPaintBoxa : TPaintBox);
begin
NazwaPaintBoxa.Canvas.Brush.Color:=clWhite;
NazwaPaintBoxa.Canvas.Rectangle(10,10,50,50);
end;

procedure Rysuj_2(NazwaPaintBoxa : TPaintBox);
var i:integer;
begin
NazwaPaintBoxa.canvas.Brush.color:=clblack;
NazwaPaintBoxa.Canvas.FillRect(Form1.ClientRect);
for i:=1 downto 0 do begin
if i>0 then begin
NazwaPaintBoxa.canvas.Pen.color:=clgray;
NazwaPaintBoxa.canvas.Pen.Width:=1;
with Form1 do
begin
NazwaPaintBoxa.Canvas.Rectangle(tab[i].X,tab[i].Y,tab[i+1].X,tab[i+1].Y);
end;
end;
end;
end;

end.
0

Możesz również tak:

Wszystko co masz pomiędzy gwiazdkami wrzuć do jakiegoś pliku, i nazwij go powiedzmy "plik1.inc"
A następnie w miejsce gwiazdek wpisz:

{$I plik1.inc}

Dyrektywa kompilatora {$I}:
http://4programmers.net/Delphi/$I

0
maxmad napisał(a)

Mamy taki oto fragment kodu, linie pomiędzy gwiazdkami chciałbym umieścić najlepiej w jakimś module lub bibliotece nie znajdującym się w główmy pliku projektu (.pas).

http://4programmers.net/Delphi/Artyku%C5%82y/Biblioteki_DLL

0

Dzięki Wielkie za odpowiedzi zarówno rozwiązanie zaprezentowane przez kolegę 'olesio' jak i kolegę 'Młody' zadowala mnie :-). Sam probowałem wielokrotnie ale zarówno z plikami dołączanymi jak i modułami mi nie wychodziło wiec naprawdę jeszcze raz dzięki za pomoc.

Moją ciekawosc jeszcze budzi użycie biblioteki, chętnie posłucham porad kolegów albo popatrze na jakiś kodzik.

Z wyrazami szacunku i uznania :-)
maxmad

0

Jeszcze ja pozwolę sobie wtrącić swoje 3 grosze.
Dobrym nawykiem jest rozdzielanie programu na jak najwięcej plików pas.

Tzn. przede wszystkim zawsze tworzę sobie 3 pliki pas(nie mówię o main).
W jednym trzymam zmienne używane w różnych plikach pas. Dzięki temu unika się problemów z circular reference i ogólnie jest większy porządek.
W drugim trzymam stałe używane w projekcie. Dzięki temu też się robi większy porządek, bo zawsze wiem, gdzie mam stałe, jak później chcę jakąś zmienić.

W trzecim trzymam zapytania SQLowe opatrzone w funkcje.
Tzn. np: DBGetClientName(ClientID: integer): string

Dzięki temu nie mam porozwalanych zapytań do bazy w całym projekcie, tylko w jednym miejscu.

I może się okazać, że w nieskomplikowanym programie masz powiedzmy 5, czy 6 unitów i może Ci się wydawać, że to jest za dużo. Ale tak nie jest. Tworzy się naprawdę porządek i jest później dużo prościej taką aplikację rozbudować i modyfikować.

Poza tym nazywaj normalnie swoje unity.

Ja stosuję taką politykę - jeśli unit ma w sobie formę, nazywam go od f, np: fMain, czy fAddClient, w innym wypadku nazywam go od u, np: uVars(tam trzymam zmienne używane w kilku unitach), uConst, uDBManagement(tu trzymam te zapytania).

Nazywanie unitów jest bardzo ważne, bo potem, żeby dojść do czegoś jak nie są odpowiednio ponazywane - czasami to graniczy z cudem.

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