Avatar billede jakob/cosmo Nybegynder
10. februar 2002 - 17:06 Der er 11 kommentarer

Usses

Hej alle!!

PROBLEM=Jeg har en 2 unit'er kaldet cardclasses og cardfkt. Og denne unit skal bruges under både interface og implementation i en anden unit kaldet gui. Men det kan den jo ikke eller hvad???

Baladen:

interface

uses
  Windows, Messages, Classes, Graphics, Controls, Forms,
  StdCtrls, Menus, >>>>>cardclasses<<<<<, >>>>>cardfkt<<<<<;

  procedure MouseDown(Pile: TPile; Card: TCard);
  procedure MouseUp(Pile: TPile; Card: TCard);

type
implementation

{$R *.DFM}
uses dialogs, sysutils,>>>>>cardclasses<<<<<,>>>>>cardfkt<<<<<;
Avatar billede erikjacobsen Ekspert
10. februar 2002 - 17:13 #1
Du skriver den kun under interface - så går det nok
Avatar billede jakob/cosmo Nybegynder
10. februar 2002 - 17:21 #2
nej det gør det ikke for jeg skal bruge cardclasses længere ned i en procedure:-(
Avatar billede martinlind Nybegynder
10. februar 2002 - 17:32 #3
Jo det gør det !!!!
Avatar billede erikjacobsen Ekspert
10. februar 2002 - 17:37 #4
Prøv det nu bare
Avatar billede martinlind Nybegynder
10. februar 2002 - 17:42 #5
Det er sjovt at "man" er så skrå sikker når man er nybegynder og har "behov" for hjælp fra eksperten :)
Avatar billede jhc Nybegynder
10. februar 2002 - 18:57 #6
Hvis du skriver følgende i den unit som skal bruge den kan du både se den under interface men også implementations delen i Delphi.

Eksempel :

Du har din unit kaldet gui i den skriver du under uses følgende

Uses
  cardclasses,cardfkt

Men hvis du kun skal bruge dem i nogle funktioner eller procedure i unit GUI, så vil jeg råde dig til at lige dem under implementation for der spare de plads på din stack.


I det tilfælde hvor der er opeationer som du har behov for at benytte gensidigt, altså at du i de 2 unit har en operation som du vil kalde fra Gui og du i GUI har en operation som du vil kalde fra de 2 andre - så vil det være en fordel at ekspotere disse til en 4 unit.
Avatar billede jakob/cosmo Nybegynder
11. februar 2002 - 09:53 #7
jamen hvorfor kan jeg så ikke få min gui.mousedown/mouseup  til at virke jeg troede at det var galt med usses den ser sådan ud:


unit gui;

interface

uses
  Windows, Messages, Classes, Graphics, Controls, Forms,
  StdCtrls, Menus, cardclasses, cardfkt;

  procedure NewGame;
  procedure ProgInit;
  procedure MouseDown(Pile: TPile; Card: TCard);
  procedure MouseUp(Pile: TPile; Card: TCard);

type
  TFrmBord = class(TForm)
    MainMenu1: TMainMenu;
    Nytspil1: TMenuItem;
    Afslut1: TMenuItem;
    Afslut2: TMenuItem;
    procedure FormPaint(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Afslut1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Afslut2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure EraseRect(HFillrect,VFillRect: TRect);
    procedure DrawEmptyPile(aType: integer;x1,y1: integer);
    procedure CardDrawInverted(x,y,CardNr: integer);
    procedure CardDraw(x,y,CardNr: integer);
    procedure BackDraw(x,y,BackNr: integer);
  end;

var
  FrmBord: TFrmBord;

implementation

{$R *.DFM}
uses dialogs, sysutils;

{ her kan du placere globale erklæringer af f.eks. pile }
var p1,p2: TPile;

procedure TFrmBord.EraseRect(HFillrect,VFillRect: TRect);
begin
  Canvas.brush.Color:=Color;
  Canvas.FillRect(HFillRect);
  Canvas.FillRect(VFillRect);
end;

procedure TFrmBord.DrawEmptyPile(aType: integer;x1,y1: integer);
const d=5;
var i: integer;
begin
  case aType of
    1: _BackDraw(Canvas,x1,y1,14);
    2: _BackDraw(Canvas,x1,y1,13);
    else
      Canvas.Pen.Color:=clLime;
      for i:=0 to 1 do
        Canvas.RoundRect(x1+i,y1+i,x1+CardWidth-i,y1+CardHeight-i,d,d);
  end
end;

procedure TFrmBord.CardDrawInverted(x,y,CardNr: integer);
begin
  _CardDrawInverted(FrmBord.Canvas,x,y,CardNr);
end;

procedure TFrmBord.CardDraw(x,y,CardNr: integer);
begin
  _CardDraw(FrmBord.Canvas,x,y,CardNr);
end;

procedure TFrmBord.BackDraw(x,y,BackNr: integer);
begin
  _BackDraw(FrmBord.Canvas,x,y,BackNr);
end;

procedure TFrmBord.FormPaint(Sender: TObject);
begin
  CTable.Refresh;
end;

procedure TFrmBord.Afslut2Click(Sender: TObject);
begin
  close
end;

procedure TFrmBord.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  CTable.Clear;
end;

procedure NewGame;
{ Kaldes ved start af nyt spil;
  skriv evt. initialiseringer ved start af nyt spil;
  HUSK først at kalde free for alle skabte objekter fra
  evt. tidligere spil  }
begin
    p1 := TPile.Create(20, 20, 0, 0);
    CTable.addPile(p1);
    p1.make52;
    p2 := TPile.Create(100, 50, 0, 20);
    CTable.addPile(p2);
end;

procedure ProgInit;
{ Kaldes ved programstart;
  skriv evt. initialiseringer ved programstart i denne procedure }
begin
    ShowMessage('hejhej')
end;

procedure MouseDown(Pile: TPile; Card: TCard);
{ kaldes ved MouseDown i bunken Pile på kortet Card;
  skriv kode der skal udføres ved MouseDown }
var c: TCard;
begin
  if Pile=p1 then
  begin
      showmessage('Jeg blev kørt!!');
  end;
end;

procedure MouseUp(Pile: TPile; Card: TCard);
{ kaldes ved MouseUp i bunken Pile på kortet Card;
  skriv kode der skal udføres ved MouseUp }
var c: TCard;
begin
end;

procedure TFrmBord.FormCreate(Sender: TObject);
begin
  ProgInit;
end;

procedure TFrmBord.Afslut1Click(Sender: TObject);
begin
  NewGame;
end;

procedure TFrmBord.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var p: TPile; c: TCard;
begin
  CTable.GetPileCardAt(x,y,p,c);
  if p<>nil then gui.MouseDown(p,c);
end;

procedure TFrmBord.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var p: TPile; c: TCard;
begin
  CTable.GetPileCardAt(x,y,p,c);
  if p<>nil then gui.MouseUp(p,c);
end;


end.
Avatar billede jakob/cosmo Nybegynder
11. februar 2002 - 09:55 #8
det er min mousedown der ikke virker jeg troede det var usses:

procedure TFrmBord.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var p: TPile; c: TCard;
begin
  CTable.GetPileCardAt(x,y,p,c);
  if p<>nil then gui.MouseDown(p,c);
end;

procedure MouseDown(Pile: TPile; Card: TCard);
{ kaldes ved MouseDown i bunken Pile på kortet Card;
  skriv kode der skal udføres ved MouseDown }
var c: TCard;
begin
  if Pile=p1 then
  begin
      showmessage('Jeg blev kørt!!');
  end;
end;
Avatar billede erikjacobsen Ekspert
11. februar 2002 - 10:46 #9
Jeg gætter på at  CTable.GetPileCardAt(x,y,p,c); ikke
returnerer den korrekte TPile.
Avatar billede jhc Nybegynder
11. februar 2002 - 11:14 #10
Du skal ikke skrive gui.operationsnavn men blot kalde den ved navn på operation- Operationerne er ikke en del af en klasse

du skal altså ændre kaldet fra at være
gui.MouseDown(1,1)
til at være
  MouseDown(1,1)
Avatar billede martinlind Nybegynder
11. februar 2002 - 11:25 #11
Man kan godt bruge . når man kalder procedure fra en unit, det betyder at man ikke behøver use den aktuele unit, da man med . fortæller hvilken unit man vil ha' : "system.delete" referer altså til delete proceduren i system unit'en

/Martin
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester