Watek, jak to naprawic

0

Mam taki kod programu, który obsługuje port LPT (ustawiania na zmiane stan wysoki i niski na linii D0-D7). Obsługa portu LPT odbywa sie poprzez komponent NpsPort. Zrobiłem to na wątku, zeby działało niezaleznie. Dodatkowo dla celów orientacyjnych zrobilem licznik (j=j+1). I tutaj zaczyna sie problem. Komponent NpsPort wymaga w pierwszej kolejności przypisania adresu portu LPT. Jezeli zrobie to w procedurze TTest.Execute; (Port2.Address:=$378;) to wczesniejszy licznik mi nie działa. Bez tej komendy licznik działa.
Wiec gdzie musze wykonać polecenie Port2.Address:=$378;) aby ten licznik zadziałał?????

Zdrówka

unit MainFrm;

interface

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

type
  TMainForm = class(TForm)
    btnStart: TButton;
    btnStop: TButton;
    Port1: TNpsPortB;
    procedure btnStartClick(Sender: TObject);
    procedure btnStopClick(Sender: TObject);
  private
    { Private declarations }
  public
  ar:longint;
    { Public declarations }
  end;

(*             WATEK          *)

  TTest = class(TThread)
  private
     ak:real;
     Port2:TNpsPortB;
   protected
    procedure Execute; override;
  public

  end;

var
  MainForm: TMainForm;
  Test : TTest;

implementation

{$R *.DFM}



procedure TTest.Execute;
var
  j:longint;

begin
  FreeOnTerminate := True;
  j:=0;

  Port2.Address:=$378; ///problem

  while not (Application.Terminated) or (Terminated) do
  begin
        j:=j+1;
        MainForm.ar:=j;
        MainForm.Canvas.TextOut(100,100,IntTostr(j));

        Port2.Value:=255;
        Port2.Value:=0;
   end;
end;



procedure TMainForm.btnStartClick(Sender: TObject);
begin
  Test.Resume;
end;

procedure TMainForm.btnStopClick(Sender: TObject);
begin
  Test.Suspend;
  btnStart.Caption := 'Wznów';
  Canvas.TextOut(200,100,IntTostr(ar));
end;

initialization
  Test:=TTest.Create(True);

end.
0

Chyba problem polega na tym iż nie utworzyłem komponentu poprzez wywołanie jego konstruktora. Ale znowu pytanie w którym miejscu to zrobić???</b>

0
  TTest = class(TThread)
  private
     ak: Real;
     Port2: TNpsPortB;
     j: LongInt;
   protected
    procedure Execute; override;
    procedure Wypisz(x: LongInt);
  public

  end;

implementation

{$R *.DFM}

procedure TTest.Wypisz(x: LongInt);
begin
  MainForm.a r:= x;
  MainForm.Canvas.TextOut(100, 100, IntTostr(x));
end;

procedure TTest.Execute;
begin
  FreeOnTerminate := True;
  Port2 := TNpsPortB.Create;
  j:=0;
  Port2.Address:=$378;

  while not (Application.Terminated) or (Terminated) do
  begin
    j:=j+1;
    Synchronize(Wypisz(IntTostr(j));
    Port2.Value:=255;
    Port2.Value:=0;
  end;
  FreeAndNil(TNpsPortB);
end;
0

Pojawia sie bład w poleceniu:

Port2 := TNpsPortB.Create;

Kompilator pisze, że "not enough actual parametr"

0
kochzg napisał(a)

Pojawia sie bład w poleceniu:

Port2 := TNpsPortB.Create;

Kompilator pisze, że "not enough actual parametr"

To ja mam za Ciebie pisać tą aplikacje? A skąd mam wiedzieć jaki konstruktor ma TNpsPortB?? Jest błąd to go popraw, przecież to n ie jest gotowy kod tylko wskazówka!!!

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