Jump to content
GSForum - Segélyvonal

Delphi kezdõknek


Cheater

Recommended Posts

wizard

Special!

 

Mi lenne, ha nem mindig mi oldanank meg a hazi feladataidat?

Szerintem ha nem probalkozol vele, akkor sohasem tanulsz meg programozni.

 

Egy problema megoldasan sokat kell gondolkodni, tesztelni, es csak ha elekadtal valahol, vagy

mar tenyleg nem jut semmi az eszedbe, akkor kell segitseget kerni.

 

Link to comment
Share on other sites

special

Nem házi feladat, amugy közben megoldottam csak hamar kérdezek =] de Így mire már tényleg nem tudok mire jutni addigra a válasz is meglesz és nem kell várnom;) vágesz?:D

Link to comment
Share on other sites

  • 2 weeks later...
special

Sziasztok újra, neharagudjatok, hogy újra írok ezt most tényleg nem tudom hogyan is kéne hogy: van két formom és az elsobol atvinni értékeket a másikba ... probaltam ugyhogy a form1-en egy buttonklickbe beletettem, hogy pl: Tfom2.Label1.caption := Edit1.text; .. de Így nem ment meg probalgattam, de igazából nem jöttem rá, hogy hogyan kéne :/ és bocsi az elõbbi idétlen kérdéseimért, és erre a kérdésre a választ elõre köszi!

Link to comment
Share on other sites

arpsoft

A tform2 a másik formodnak a neve?

Link to comment
Share on other sites

special

Igen, igazából egy ilyen játékszerûséget írok, és egy radiogroupnak az indexének az értékét akarom atvarázsolni a 2. formra, hogy az index alapján nyisson meg filet, minden menne csak nem tudom, hogy az Form1-rõl(elsõ lap), a Form2-re(masodik lap), hogy vigyek át adatot, igazaból csak az elv kéne, hogy hogyan is kell ezt csinálni.

Link to comment
Share on other sites

arpsoft

Na látod, nem tform2, hanem form2!

 

Annyira nem vagyok otthon delphi-ben, de ezt kipróbálnám:

form1.parent.form2.Label1.caption := Edit1.text;

Link to comment
Share on other sites

  • 1 month later...
Calyd

Lehet, hogy már nem aktuális a probléma a kérdezõnek, de attól még leírnám a megoldást:

 

Form2.Label1.Caption:=Edit1.Text - amennyiben a kódrészlet a Form1 unitjában használandó. Mivel a Form2 egy globális változó, így a Form1 unitja csak akkor fog róla tudni, ha a unitlistájába felvesszük a Form2 unitját.

 

Label1.Caption:=Form1.Edit1.Text - amennyiben a kódrészlet a Form2 unitjában van. Ebben az esetben a fenti intelem fordítva értendõ.

 

Megjegyzés: ha esetleg a Form1 unitjába a Form2 unitját beillesztettük, és valami miatt a Form2 unitjában is szükségünk van a Form1 unitjára, akkor ha ott is felvesszük, akkor a unitok között kereszthivatkozás lesz. Ezt úgy tudjuk elkerülni, hogy vagy az egyiket, vagy mindkettõt nem az INTERFACE rész USES részébe vesszük fel, hanem az IMPLEMENTATION részbe írjuk be a használatát.

Link to comment
Share on other sites

  • 1 month later...
marthazoli

@Calyd

 

Az utóbbi megjegyzésre volt most pontosan szükségem :D

Köszi! :istenvagy:

Link to comment
Share on other sites

  • 3 weeks later...
blackdragon

Sziasztok!

 

Lenne egy elég alapszintû kérdésem: miért kapom azt a hibaüzenetet compile-kor, hogy: Undeclared Identifier: Image2 ? Ugyanis egy eljárásból szeretném megváltoztatni a kép Visible státuszát. Az eljárás saját eljárás, vagyis nem vezérel semmilyen komponenst, egy gomb lenyomásával beinduló eljárásból hívódik meg.

Link to comment
Share on other sites

demian

Undeclared Identifier = nincs deklarálva a változó.

 

Vagyis a programodba nincs Image2, Image1 lehet, amúgy ha nyomsz egy CRTL+SPACE -t akkor a Delphi automatikusan felajánlja neked a választékot. Ha beillesztenéd a forráskódot vagy pontosan leírnád mi a gond, akkor szerintem tudnának neked segíteni. De így elsőre az, hogy nincs Image2-d a formon.

 

Fórumszabályzat, 3. pont!

Link to comment
Share on other sites

Calyd

Szerintem nem itt lesz a hiba. Ha valaki Image2-t használ, az valószínűleg van is. Ez nem egy olyan elfelejthető komponens mint mondjuk egy ciklusváltozó :)

Én arra gyanakszom, hogy a delikvensünk a "saját eljárás"-át nem a Form objektumban helyezte el, hanem csak úgy a unitban. Így pedig, ha csak simán Image2-ként hivatkozik a Form egy elemére, akkor sajnos az eljárás azt nem fogja látni - nem is láthatja. Ez esetben két féle megoldást tudok javasolni:

 

- az egyik, hogy a Form részeként használjuk azokat az eljárásokat, függvényeket, változókat is, amiket mi magunk írunk. Ez teljesen szabályos, nincs benne semmi kivetnivaló. Pl algoritmikusan.:

Típus TForm1=Osztály(TForm)(

...mezők (akár sajátok is, tehát mondjuk egész típusú változók)...

Eljárás Saját(paraméterek);

Függvény SajátFGV(paraméterek):TÉrtékTípus

...);

Természetesen a saját elemek elhelyezhetők a private, vagy akár a public részben is, erre nincs megkötés.

 

- a másik, hogy egyszerűen abszolút módon hivatkozunk az objektumra. Jelen esetben így nézhetne ki:

Procedure Sajat(...);

Begin

Form(x).Image2.Visible:=...;

End;

Link to comment
Share on other sites

  • 2 weeks later...
blackdragon

@Calyd

 

Ha késve is, de köszönöm válaszodat, ez volt a gond, mármint, hogy nem volt az illetõ eljárás a Form objektumban.

Link to comment
Share on other sites

  • 5 weeks later...
verciteam1988

Hi Mindenkinek! Tudna nekem valaki abban segíteni hogy lehet egy Listbox tartalmát kiiratni egy általunk létrehozott fileba!!

Hálás lennék!

Elõre is köszönöm!

Link to comment
Share on other sites

Calyd

Szia!

 

Hát erre "manuálisan" is volna lehetõséged, ha más nem jut eszedbe, de amit szerintem te keresel a következõ: a TStrings típus elemek tartalmaznak egy LoadFromFile(Const f:FileName) és egy SaveToFile(Const f:FileName) eljárásokat. A ListBox is egy ilyenben tárolja a tartalmát, ennek a mezõnek a neve Items. Így - ha az aktuális objektumod neve ListBox1 - akkor a következõképp néz ki az eljárás hívása: ListBox1.Items.SaveToFile(f) [f a fájl elérési útvonala].

Link to comment
Share on other sites

kfx

Két dologra lennék kíváncsi:

1. Hogyan lehet fájlt egy adott helyen létrehozni?

2. Mappát?

Link to comment
Share on other sites

  • 3 weeks later...
DonTomika

Hello!

 

Üres fájl:

FileClose(FileCreate('C:\Mappa\Fájlnév.txt'));

 

Mappa:

ForceDirectories('C:\asd\fgh\hjk');

 

Az alsó példában az asd és az fgh mappának sem kell léteznie, létrehozza azt is.

Link to comment
Share on other sites

Lord_Jene

Valaki segítene nekem?

A problémám: Milyen parancssorral tudnám elérni azt, hogy egy másik alkalmazásba illesszek be szöveget (mármint egy beviteli mezőbe)?

Link to comment
Share on other sites

Calyd

@DonTomika:

 

Bocsánat, lehet, hogy láma kérdés, de ez miként hoz létre fájlt? Vagy hogy pontosabban fogalmazzak, én nem egészen így szoktam fájlt létrehozni. Hanem vagy írása vagy olvasásra nyitok meg, és a z írásra nyitás, ha a fájl nem létezik, akkor létrehozza. A Reset és ReWrite eljárásokról beszélek. Ez valamiben különbözik a ReWrite-tól?

 

@Lord Jene:

 

Félre értés ne essék, nem akarlak lenézni, de ha nem vagy haladó a programozásban, akkor ez nehéz lesz. Bár érdekes a probléma, utána is néztem, de egyelõre én nem találtam egyszerûen megfogható megoldást. Vitatkozásokat találtam, hogy melyik függvény mire jó, és hogy lehet használni. Ha találok valami általam is kipróbált, biztos megoldást, amit teljes mértékben értek is, akkor leírom - már ha addig nem lövi le a poént valaki nálam okosabb.

Link to comment
Share on other sites

Lord_Jene

Leírom pontosan mit is szeretnék megvalósítani, bár ha ilyen bonyult, akkor nem fontos... Nem vagyok profi, de szerintem sok mindent megértek :D Ha mégis találsz valamit írd le kérlek, max nem sikerül megírni.

 

Szóval van egy játék (ablakban fut, Java-ban írták, internetes) nevezetesen a Puzzle Pirates, és ennek a játéknak van egy chat mezeje úgymond alul - egy üres sor, ahova lehet írkálni a többieknek. Én egy olyan programot akartam írni, amelyben eltárolhatnánk elõre szövegeketm és vmilyen gyorsbillentyûvel lehetne elõhívni õket... Erre azért lenne szükségem, mert van néhány olyan szabvány szöveg, amit már csomószor le kellett írnom embereknek, és ezt akartam lerövidíteni.

Link to comment
Share on other sites

TheSaurus

Jegyzettömb, Ctrl+C, Ctrl-V. Hm...?

Link to comment
Share on other sites

DonTomika

@Calyd:

Tulajdonképpen ezzel is hasonló módon tudod kezelni a fájlokat, mint a Reset/ReWrite párossal. Fájlt megnyitni a FileOpen függvénnyel tudsz, visszaad egy leírót a fájlra (típusa Integer). Elsõ paramétere a fájlnév, a második pedig, hogy hogyan nyissa meg. fmOpenRead = olvasásra, fmOpenWrite = írásra, fmOpenReadWrite = írásra és olvasásra (van még több is, bõvebb info a Delphi helpben). Ezeket a jelzõket az or mûvelettel kombinálhatod.

Új fájlt létrehozni a FileCreate függvénnyel tudsz, csak egy paramétere van, a fájl neve. A létrehozás után a fájlt megnyitja írásra és olvasásra is. A FileOpen-hez hasonlóan ez is egy leíróval tér vissza.

Olvasni a fájlból a FileRead függvénnyel tudsz, elsõ paramétere a fájl leírója (amit korábban a FileOpen visszaadott), a második egy puffer, ahova az adatokat fogja olvasni (lehet pl. egy tömb), a harmadik paraméter pedig az olvasandó adatok száma (bájtban). A visszatéréi érték a függvény által ténylegesen beolvasott bájtok számát adja meg, amely kisebb (ha a fájl végére ért), vagy egyenlõ az általad megadott 3. paraméterrel. Lehet még -1 is, ha hiba volt. Ilyenkor a GetLastError Windows API függvény segít megtalálni a hiba okát, megjelenítése például:

ShowMessage(SysErrorMessage(GetLastError));

Írni a fájlba hasonlóképpen tudsz, csak a FileWrite függvényt kell használni. A paraméterezése megegyezik a fent leírtakkal, a visszatérési érték úgyszintén.

A fájlban mozogni a FileSeek függvénnyel tudsz, elsõ paramétere a fájl leírója, a második, hogy hányadik bájtra akarsz ugrani, a harmadik pedig hogy honnan (soFromCurrent = az aktuális pozíciótól, soFromBeginning = a fájl elejérõl, soFromEnd = a fájl végérõl).

Használat után a fájlt a FileClose eljárással be kell zárni, egyetlen paramétere a fájl leírója, amely az eljárás végrehajtása után érvénytelen lesz (a használathoz a fájlt újra meg kell nyitni).

 

Na, ha már képes voltam összegépelni ennyi vackot, akkor írok egy példát is:

procedure TForm1.ABC(FileName: string);
var hFile, i:Integer;
    buf: array [0..25] of char;
begin
  hFile:=FileCreate(FileName);
  if hFile>0 then
  begin
    for i:=Low(buf) to High(buf) do
    begin
      buf[i]:=Chr(i+65);
    end;
    FileWrite(hFile, buf, sizeof(buf));
    FileClose(hFile);
  end
  else
    MessageBox(Self.Handle, PChar(SysErrorMessage(GetLastError)), nil, MB_ICONERROR or MB_OK);
end;

(Kiírja az angol abc nagy betûit egy fájlba)

Link to comment
Share on other sites

Lord_Jene

Hogy miért akarok programot írni rá a Ctrl+C, Ctrl+V helyett?

 

Az túl sokáig tart, meg közben még le is kell rakni tálcára a programot, stb - Egyébként most így csinálom ;)

 

Egyébként közben elment már a kedvem tőle, úgyhogy nem foglalkozok ezzel a témával, van sok más fontosabb dolgom is...

Link to comment
Share on other sites

DonTomika

@Lord Jene:

Nos, a más alkalmazásba való szövegek beillesztéséhez a Delphi is tartalmaz eszközt. Van a Visual Basicben egy SendKeys nevû eljárás, amivel az aktív ablakba lehet szöveget írni. A Delphi portját megtalálhatod a Delphi CD info/extras mappájában sndkey32.pas néven. Ezt másold be a $Delphi\lib mappába, majd add hozzá a programod uses listájához.

A gyorsbillenytûk kezeléséhez pedig ott van a RegisterHotKey Windows API függvény. Elsõ paramétere az ablakod leírója, a második egy egyedi azonosítószám, a harmadik egy, vagy több módosító billentyû (MOD_SHIFT, MOD_CONTROL, MOD_ALT és MOD_WIN) az or mûvelettel összekapcsolva, a negyedik pedig a billentyû kódja, pl. VK_F1. Ha a felhasználó a billenytû(ket) lenyomta, az ablakod kap egy WM_HOTKEY üzenetet.

 

Na, ha nem akarsz vele foglalkozni, akkor itt egy kód, ezzel már nem sok baj van:

 

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure WMHotKey(var Message:TWMHotKey); message WM_HOTKEY;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  mID = 12;
  HotKeys : array [1..2] of record
    fsMod:Cardinal;
    VK:Cardinal;
    Text:String;
  end = (
    (fsMod: MOD_ALT or MOD_CONTROL; VK: Ord('S'); Text: 'Szia'),
    (fsMod: MOD_ALT or MOD_CONTROL; VK: Ord('H'); Text: 'Hello')
  );

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i:Integer;
begin
  Application.ShowMainForm:=false;
  RegisterHotKey(Handle, mID, MOD_CONTROL or MOD_ALT, VK_F4);
  for i:=Low(HotKeys) to High(HotKeys) do
  begin
    RegisterHotKey(Handle, mID+i, HotKeys[i].fsMod, HotKeys[i].VK);
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var i:Integer;
begin
  UnRegisterHotKey(Handle, mID);
  for i:=Low(HotKeys) to High(HotKeys) do
  begin
    UnRegisterHotKey(Handle, mID+i);
  end;
end;

procedure TForm1.WMHotKey(var Message: TWMHotKey);
var i:Integer;
    aStr:array [0..$FFF] of char;
    CtrlState, ShiftState, AltState, WinState: Boolean;
begin
  if Message.HotKey = mID then
  begin
    Close;
  end
  else
    for i:=Low(HotKeys) to High(HotKeys) do
    begin
      if Message.HotKey = mID+i then
      begin
        GetWindowText(GetForegroundWindow, aStr, sizeof(aStr));
        if (AnsiPos('IRC', AnsiUppercase(aStr))>0) or (AnsiPos('CHAT', AnsiUppercase(aStr))>0) then
        begin
          CtrlState:=(GetKeyState(VK_CONTROL) and (1 shl 31)) <> 0;
          ShiftState:=(GetKeyState(VK_SHIFT) and (1 shl 31)) <> 0;
          AltState:=(GetKeyState(VK_MENU) and (1 shl 31)) <> 0;
          WinState:=(GetKeyState(VK_LWIN) and (1 shl 31)) <> 0;
          if CtrlState then
          begin
            keybd_event(VK_CONTROL, Lo(MapVirtualKey(VK_CONTROL, 0)), KEYEVENTF_KEYUP, 0);
          end;
          if ShiftState then
          begin
            keybd_event(VK_SHIFT, Lo(MapVirtualKey(VK_SHIFT, 0)), KEYEVENTF_KEYUP, 0);
          end;
          if AltState then
          begin
            keybd_event(VK_MENU, Lo(MapVirtualKey(VK_MENU, 0)), KEYEVENTF_KEYUP, 0);
          end;
          if WinState then
          begin
            keybd_event(VK_LWIN, Lo(MapVirtualKey(VK_LWIN, 0)), KEYEVENTF_KEYUP, 0);
          end;

          SendKeys(PChar(HotKeys[i].Text), false);

          if CtrlState then
          begin
            keybd_event(VK_CONTROL, Lo(MapVirtualKey(VK_CONTROL, 0)), 0, 0);
          end;
          if ShiftState then
          begin
            keybd_event(VK_SHIFT, Lo(MapVirtualKey(VK_SHIFT, 0)), 0, 0);
          end;
          if AltState then
          begin
            keybd_event(VK_MENU, Lo(MapVirtualKey(VK_MENU, 0)), 0, 0);
          end;
          if WinState then
          begin
            keybd_event(VK_LWIN, Lo(MapVirtualKey(VK_LWIN, 0)), 0, 0);
          end;
        end;
      end;
    end;
end;

end.

 

Nyiss egy új projectet, majd az egész kódot írd felül a fentivel. Használata: Ctrl+Alt+F4 = kilépés, Ctrl+Alt+S = "Szia" beszúrása, Ctrl+Alt+H = "Hello" beszúrása. Szöveget csak akkor illeszt be, ha az aktív ablak címsorában benne van a "chat" vagy az "irc" string. (Ezt majd módosítsd a javás chat címsorának megfelelõen.)

Link to comment
Share on other sites

Guest

Sziasztok!

Egy filmadatbázist szeretnék megcsinálni Delphiben, de valahogy nem akar összejönni. :(

Elsõnek is azt szeretném megkérdezni, hogy az elején azt, hogy pl 0-9 nyomógombom legyen amivel az olyan filmekre tudok hivatkozni, amik számmal kezdõdnek.

Remélem tudtok segíteni. ;)

 

Link to comment
Share on other sites

Calyd

Selene: "Elsõnek is azt szeretném megkérdezni, hogy az elején azt, hogy pl 0-9 nyomógombom legyen amivel az olyan filmekre tudok hivatkozni, amik számmal kezdõdnek."

 

- ne haragudj de ezt a mondatot nem tudom értelmezni :)

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...