Új hozzászólás Aktív témák
-
zka67
őstag
Nagyon egyszerű a dolog: kell egy Inpout32.dll, amit vagy a program könyvtárába teszel vagy a System32-be.
ZIP közvetlen letöltése, a kicsomagolás után a dll-t az inpout32_source_and_bins\binaries\Dll könyvtárban találod. Neked csak ez a ~12kB-os fájl kell.
A delphi forrásba pedig az implementation után beteszed ezt a két sort:
function Out32(Addr:word;b:byte):byte; stdcall; external 'inpout32.dll';
function Inp32(Addr:word):byte; stdcall; external 'inpout32.dll';Aztán már csak értelemszerűen használod, pl:
Out32($0378,0);
Result := Inp32($0379);[ Szerkesztve ]
-
zka67
őstag
-
zka67
őstag
Én meg teljesen leálltam az LPT portról, kizárólag soros portot használok. Az még azért egy mindig van az alaplapon, ha több kell, akkor van 4 portos kártya, vagy van USB-Soros átalakító. Egy 160 Ft-os mikrokontroller kell hozzá, és kész a soros-párhuzamos átalakító, be és kimenetekkel. Pár sor a program, ami a mikrokontrollerbe kell. Írtam hozzá egy DLL-t is, ami eventet generál, ha változás van valamelyik bemeneten, bitenként (is) lehet vezérelni a kimeneteket, és nem kell tudnod, hogy az épp egy soros porton megy.
-
zka67
őstag
Atmel AT89C2051-et használok, ennek 6 ki és 6 bemenetet csináltam +1 led. Ha több kimenet kellene, akkor az AT89S8253-at használnám, de eddig még mindenhová elég volt a 6-6. A C2051-hez csináltam programozót, az S8253 meg ISP-s, ahhoz is csináltam egy soros programozót (C2051-el ). Ezt a két típust szoktam használni, a PIC-eket nem szeretem, én intel procikon nőttem fel és képtelen vagyok megtanulni a PIC-et. Igaz nem is nagyon erőltettem a dolgot. Mondom, a C2051-et ~160 Ft+áfáért veszem.
Most van egy melóm, amihez lehet, hogy kevés lesz a 6 kimenet, de nem csinálok új nyákot, hanem inkább két soros portot fogok használni.
-
zka67
őstag
-
zka67
őstag
Nem kell ennyire túlbonyolítani!
procedure TMainForm.EditKeyPress(Sender: TObject; var Key: Char);
begin
if Length( TEdit(Sender).Text ) > 10 then
TEdit(Sender).Text := '';
end;Mindhárom Edit-ednek ugyanazt az OnKeyPress eventet állítod be (ezért neveztem át Edit1KeyPress-ről) és a TEdit(Sender)-rel megkapod a hívó elem adatait.
-
zka67
őstag
Az első kérdésedre:
with Memo1 do buff := Copy(Text,SelStart+1,SelLength);
A második kérdésedet nem értem. Ha az Enabled értékét false-ra állítod, akkor szürke lesz a szöveg.
Az utolsó kérdésedre:
BiDiMode : TBiDiMode;
TBiDiMode = (bdLeftToRight, bdRightToLeft, bdRightToLeftNoAlign,
bdRightToLeftReadingOnly);Ha jobbra akarod igazítani akkor
BiDiMode := bdRightToLeft;
-
zka67
őstag
Külön opció nincs, de nem nehéz megírni. Csinálsz egy új osztályt, pl. TGrayEdit-et:
type TGrayEdit = class(TCustomEdit)
private
procedure SetEnabled(Value : boolean);
function GetEnabled : boolean;
public
property Enabled : boolean read GetEnabled write SetEnabled;
end;Megírod hozzá az Enabled funkciókat:
procedure TGrayEdit.SetEnabled(Value : boolean);
begin
TControl(Self).Enabled := Value;
if Value then Color := clWhite else Color := clSilver;
end;
function TGrayEdit.GetEnabled : boolean;
begin
Result := TControl(Self).Enabled;
end;A form-odban vagy ahol használod:
type
TMainForm = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
public
GrayEdit : TGrayEdit;
end;Létrehozod a GrayEdit-e(ket):
procedure TMainForm.FormCreate(Sender: TObject);
begin
GrayEdit := TGrayEdit.Create(Self);
with GrayEdit do begin
Parent := MainForm;
Left := 8;
Top := 8;
Text := 'Proba';
end;
end;és használhatod :
procedure TMainForm.Button1Click(Sender: TObject);
begin
GrayEdit.Enabled := not GrayEdit.Enabled;
end; -
zka67
őstag
Gondolom (remélem) már nem XP-re fejlesztesz. Vista és 7 alatt a Registry-t már nem engedi "csak úgy" írkálni, meg olvasgatni sem, csak a következőképpen:
with TRegistry.Create(MAXIMUM_ALLOWED) do
try
...
finally
Free;
end;Van még egy hiba a programodban, az EnableProxy-ban az OpenKey előtt van egy WriteBool, az szerinted hová ír?
-
zka67
őstag
Használj ini fájlokat:
uses IniFiles;
...
var Ini : TIniFile;
IniPath : string;
...
IniPath := AppDataPath; // célszerűen az APPDATA könyvtár
Ini := TIniFile.Create(IniPath+'\programnév\settings.ini');
param_int := Ini.ReadInteger(Section,Item,default_value);
param_str := Ini.ReadString(Section,Item,'default_value');
Ini.WriteInteger(Section,Item,param_int);
Ini.Free;Szerintem magáért beszél a dolog. Pl. egy settings.ini az ablakpozíció megjegyzéséhez:
[Main]
Left=200
Top=50És a hozzá tartozó kód:
// FormCreate
Left := Ini.ReadInteger('Main','Left',Left);
Top := Ini.ReadInteger('Main','Top',Top);
// FormClose
Ini.WriteInteger('Main','Left',Left);
Ini.WriteInteger('Main','Top',Top);[ Szerkesztve ]
-
zka67
őstag
Először megnyitod a CPortLibD2006.dpk fájlt, lefordítod (Alt-P B).
Utána megnyitod a DsgnCPortD2006.dpk fájlt, azt is lefordítod.
Utána Install Packages, megkeresed a CPortLibD2006.bpl fájlt és telepíted.
Ennyi.Hozzátennék még annyit, hogy a soros port nem egészen úgy működik, ahogy te azt elképzelted. Neked nem kell biteket röcögtetned benne, bízd azt a hardverre, azért van.
Javaslom, hogy előbb olvasgass utána a soros port működésének.
-
zka67
őstag
válasz sanzi89 #1901 üzenetére
1. a public részben csinálj egy Image : TImage; változót.
2. a form létrehozásakor (FormCreate) hozd létre az Image-t, a Name tulajdonságot ne bántsd.
3. az Image paramétereiben hiányzik az OnClick, ezt add hozzá:
Image.OnClick := KepClick;Ha a form tulajdonságaiban a BorderStyle-t bsNone-ra állítod, kereted sem lesz,.
A JPG1-re nincs szükséged, sem az Image Width és Height beállításokra, mivel a LoadFromFile be fogja állítani ezeket. Ha a Stretch-et true-ra állítod, akkor kinyújtja a teljes képernyőre a képet. -
zka67
őstag
A DateUtils unitban vannak a dátum/idő rutinok. Ebben megtalálod a többek között a következőket is:
function IncYear(const AValue: TDateTime; const ANumberOfYears: Integer = 1): TDateTime;
// function IncMonth is in SysUtils
function IncWeek(const AValue: TDateTime; const ANumberOfWeeks: Integer = 1): TDateTime;
function IncDay(const AValue: TDateTime; const ANumberOfDays: Integer = 1): TDateTime;
function IncHour(const AValue: TDateTime; const ANumberOfHours: Int64 = 1): TDateTime;
function IncMinute(const AValue: TDateTime; const ANumberOfMinutes: Int64 = 1): TDateTime;
function IncSecond(const AValue: TDateTime; const ANumberOfSeconds: Int64 = 1): TDateTime;
function IncMilliSecond(const AValue: TDateTime; const ANumberOfMilliSeconds: Int64 = 1): TDateTime;pl. ha egy perccel többet szeretnél a jelenlegi időnél, akkor
Label1.Caption := DateTimeToStr( IncMinute(Now, 1) );
-
zka67
őstag
válasz boros.denes #1913 üzenetére
function BinToInt(Value: string) : integer;
var i : integer;
begin
Result := 0;
for i := 1 to Length(Value) do
case Value[i] of
'0': Result := Result shl 1;
'1': Result := (Result shl 1) or 1;
else
Break;
end;
end; -
zka67
őstag
[ Szerkesztve ]
-
zka67
őstag
Így:
procedure TFom_ini.Button2Click(Sender: TObject);
var z1,z2 : Real;
begin
DecimalSeparator := '.';
z1 := StrToFloat(Edit1.text);
z2 := StrToFloat(Edit2.text);
Edit3.text := FloatToStr(z1*z2);
end;A DecimalSeparator értéke határozza meg, hogy tizedespontot vagy tizedesvesszőt fogadjon el.
A hibakezelést majd ne felejtsd el hozzáadni (try ... except),procedure TFom_ini.Button2Click(Sender: TObject);
var z1,z2 : Real;
begin
DecimalSeparator := '.';
try
z1 := StrToFloat(Edit1.text);
z2 := StrToFloat(Edit2.text);
except
on E: Exception do { Hibakezelés }
end;
Edit3.text := FloatToStr(z1*z2);
end;vagy használd a Val funkciót.
procedure TFom_ini.Button2Click(Sender: TObject);
var z1,z2 : Real;
e : integer;
begin
DecimalSeparator := '.';
Val(Edit1.Text, z1, e);
if e > 0 then begin
{ Hibakezelés, pl. z1 := 1; vagy Exit; }
end;
Val(Edit1.Text, z2, e);
if e > 0 then begin
{ Hibakezelés, pl. z2 := 1; vagy Exit; }
end;
Edit3.text := FloatToStr(z1*z2);
end;[ Szerkesztve ]
-
zka67
őstag
válasz hexameter93 #1954 üzenetére
Valószínűleg vírusod van, de ennek nem sok köze van a Delphi-hez.
-
zka67
őstag
Például ezzel az ingyenes komponenssel:
-
-
zka67
őstag
A kérdésedet inkább itt tedd fel: Milyen program, ami ...?
-
zka67
őstag
Szia, ezt próbáld ki, nekem működik:
function Execute(FileName, Params : string; Show : integer = SW_HIDE) : boolean;
var
SEInfo: TShellExecuteInfo;
ExitCode: DWORD;
begin
FillChar(SEInfo, SizeOf(SEInfo), 0) ;
SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
with SEInfo do begin
fMask := SEE_MASK_NOCLOSEPROCESS;
Wnd := Application.Handle;
lpFile := PChar(FileName) ;
lpParameters := PChar(Params);
nShow := Show;
end;
if ShellExecuteEx(@SEInfo) then begin
repeat
Application.ProcessMessages;
GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
Result := true;
end
else begin
ShowMessage('Program file not found!') ;
Result := false;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Execute('acrord32', 'filename.pdf', SW_NORMAL);
end; -
zka67
őstag
Szia, így:
Uses HTTPApp;
procedure TForm1.Button1Click(Sender: TObject);
const S : string = 'Árvíztűrő tükörfúrógép';
begin
Memo1.Lines.Add( S );
Memo1.Lines.Add( HTTPEncode( UTF8Encode(S) ) );
end;A példa kimenete:
Árvíztűrő tükörfúrógép
%C3%81rv%C3%ADzt%C5%B1r%C5%91+t%C3%BCk%C3%B6rf%C3%BAr%C3%B3g%C3%A9p
Új hozzászólás Aktív témák
- Milyen asztali (teljes vagy fél-) gépet vegyek?
- Autós kamerák
- Android alkalmazások - szoftver kibeszélő topik
- Intel Core i5 / i7 / i9 "Alder Lake-Raptor Lake/Refresh" (LGA1700)
- Ukrajnai háború
- Videó stream letöltése
- Gaming notebook topik
- Motorola Moto G24 Power - hol van az erő?
- Milyen videókártyát?
- Helldivers 2 (PC, PS5)
- További aktív témák...