Delphi - prosba o radu

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod ousteen 25. 11. 2009 14:30

Zdravím,

začínám s delphi a nevím si rady s jednou věcí. Chtěl bych si napsat jednoduchý progámek, který bude kopírovat stisknutím tlačítka zadaný text. Takže mám form1. Tam je vložen memo box. Vedle je tlačítko. No a já chci, aby se po stisknutí tlačítka zkopíroval text, který do memo napíšu. Prostě aby to mělo stejnou funkci jako když se stiskne ctrl + c (kopírovat). Potom tento text budu vkládat do jiné aplikace pomocí ctrl + v (takže je nutná práce se schránkou windows).Prosím jde tohle nějak udělat? Nejlépe bych uvítal kód, který tomu tlačítku přidat. Jak říkám, jsem začátečník tak prosím polopatě. :-)

Díky za případnou radu.
ousteen
Junior

Odeslat příspěvekod JanFiala 25. 11. 2009 14:39

uses clipbrd; // tohle pridat do uses

// na stisknuti tlacitka zavolat:
Clipboard.AsText := Memo1.Text;
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod ousteen 25. 11. 2009 17:48

Super. Moc děkuju. Už to funguje. :tleskani
ousteen
Junior

Odeslat příspěvekod ousteen 25. 11. 2009 18:01

Napadla mě ještě jedna taková vychytávka.....bylo by možné nějak přidat tlačítku funkci, aby po stisknutí se provedl printscreen obrazovky a následně se automaticky uložil např na plochu windows nebo do nějaké definované složky na disku?? Muselo by to být ve formátu obrázku. Např jpg. Hledal jsem v příručce, ale tohle tam bohužel také není :((

Ještě jednou díky.
ousteen
Junior

Odeslat příspěvekod peter.ntx 25. 11. 2009 18:22

kdyz tak neco hledas skus i google

napr tu mas ten screen shot muzes si vybrat
http://www.swissdelphicenter.ch/torry/showcode.php?id=259
Ja vim pisu kravini ale co nadelam
peter.ntx
Junior

Odeslat příspěvekod ousteen 25. 11. 2009 23:24

Dobře takže když vezmu např tohle:

Kód: Vybrat vše
// Capture the entire screen
// Screenshot des gesamten Bildschirms
procedure ScreenShot(Bild: TBitMap);
var
  c: TCanvas;
  r: TRect;
begin
  c := TCanvas.Create;
  c.Handle := GetWindowDC(GetDesktopWindow);
  try
    r := Rect(0, 0, Screen.Width, Screen.Height);
    Bild.Width := Screen.Width;
    Bild.Height := Screen.Height;
    Bild.Canvas.CopyRect(r, c, r);
  finally
    ReleaseDC(0, c.Handle);
    c.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form1.Visible := False;
  Sleep(750); // some delay, ein wenig Zeit geben
  ScreenShot(Image1.Picture.BitMap);
  Form1.Visible := True;
end;


Jsou tam dvě procedury. Tzn. 2x začátek a konec. Pokud tomu správně rozumím, tak jedna se přiřadí tlačítku. Ale kam ta druhá? Ať to dám kamkoliv tak to při kompilování hodí chybu. :--
ousteen
Junior

Odeslat příspěvekod JanFiala 26. 11. 2009 07:18

Prvni procedura je ta vykonna, ktera dela vlastni screenshot
Druha procedura ji jen vola, takze ta bude na stisk tlacitka
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod ousteen 28. 11. 2009 13:39

Takže konečně se mi podařilo udělat ten screen. Je tam tedy vložené tlačítko (button) a po stiknutí se uloží screen do obrázku. Zde je ale háček. Obrázek je vložen přímo v programu ( zobrazí se v image1). Potřeboval bych aby se po stisknutí tlačítka ten screen automaticky uložil např do složky c:/obrazek/. Prosím pokud je to jednoduché tak mě nasměrujte. Pokud je to na dlouho tak to někomu zadám, protože tohle je nad moje síly.

Díky.
ousteen
Junior

Odeslat příspěvekod Nargon 28. 11. 2009 13:52

V delphi vubec nedelam, a neznam ani moc syntaxi, tak kdyz ted placnu nejakou blbost, tak to ignoruj. Ale mohlo by to fungovat asi takto:

Kód: Vybrat vše
procedure TForm1.Button1Click(Sender: TObject);
var
  bitmap: TBitMap;
begin
  Form1.Visible := False;
  Sleep(750); // some delay, ein wenig Zeit geben
  ScreenShot(bitmap);
  bitmap.Save("c:/obrazek/soubor.bmp", "bmp");
  Form1.Visible := True;
end;

Ale jak rikam v delphi nedelam, tak netusim jak presne to zapsat ani jestli se tak jmenuje ta metoda. Kdyztak se podivej do helpu. Doufam ze te tohle alespon nakopne spravnym smerem.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod peter.ntx 28. 11. 2009 19:42

Kód: Vybrat vše
Image1.Picture.SaveToFile('c:\obrazek\Img.bmp');
bitmap.SaveToFile('c:\obrazek\Img.bmp');
Ja vim pisu kravini ale co nadelam
peter.ntx
Junior

Odeslat příspěvekod JanFiala 29. 11. 2009 08:46

Pokud neni treba obrazek zobrazovat, bude mnohem lepsi to ukladat primo do TBitMapp, program nebude muset obsluhovat cely objekt TImage
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod ousteen 8. 12. 2009 17:27

TBitMapp??

Jinak díky všem. Konečně se mi to podařilo rozchodit tak jak chci. Ještě mě napadla jedna maličkost. Používám delphi 7 a chtěl bych nějak vložit text, který by zároveň odkazaval na web. Prostě odkaz. Jak tohle provést? V nabídce objektů nemůžu nic takového najít. :-|

No a dotaz dvě. ;-) Mám v programu 6 editů. Chtěl bych, aby se dal uložit obsah všech těchto editů do jednoho souboru a potom zase načíst tak, aby každý edit obsahoval svůj text. Zkoušel jsem to přes proměnné, ale nějak mi to nejde. Umím udělat aby se uložil obsah jednoho editu do souboru a pak zase načetl (opendialog, savedialog). Ale jak udělat aby to uložilo obsah víc polí to netuším. :/

Díky za rady.

Ousteen
ousteen
Junior

Odeslat příspěvekod Just_jo 8. 12. 2009 17:38

Pro odkaz poslouží cokoliv. Stačí aby objekt měl OnClick event :
Kód: Vybrat vše
var
  HTML_File: string;
begin
  HTML_File := 'http://www.google.com/';
  ShellExecute(Handle, 'open', PChar(HTML_File),   
   nil, nil, SW_SHOW);
end;


Co se týče ukládání - já osobně raději využívám komponenty TIniFile.
Pouze do USES musíš doplnit IniFiles.
Just_jo
Junior
Uživatelský avatar

Odeslat příspěvekod Magicmaster 8. 12. 2009 19:18

Nebo místo TIniFile použít TStringList, takto:
Kód: Vybrat vše
procedure SaveEdits;
var SL:TStringList;
begin
  SL:=TStringList.Create;
  SL.Add(Edit1.Text);
  SL.Add(Edit2.Text);
  ...
  SL.Add(Edit6.Text);
  SL.SaveToFile({cesta souboru});
  SL.Free;
end;


Načítání by pak vypadalo zjednodušeně:
Kód: Vybrat vše
  Edit1.Text:=SL.Strings[0];
  atd...
Magicmaster
Junior
Uživatelský avatar

Odeslat příspěvekod ousteen 15. 12. 2009 06:42

Ahoj, takže super. Vše už tak nějak funguje. ;-) Rád bych se ale ještě zeptal na poslední dvě věci....

1: Co je to TBitMapp a kde to najít?

2: Použil jsem uložení screenu tímto kódem na tlačítku:

Image1.Picture.SaveToFile('c:/img.bmp');

Zde je ale háček....pokaždé se přepíše původní soubor. Ten můj prográmek bude dělat cca 50 screenů za jedno použití. Tím pádem pokaždé přesouvat soubor jinam, aby se nepřepsal je těžkopádné. Jak tedy přímo do tohoto ukládacího kódu doplnit podmínku, která by v případě zjištění, že soubor už existuje (podle názvu) uložila soubor s jiným názvem (např img1.bmp, img2.bmp atd....) Půjde tohle nějak provést?

Díky všem za rady.
ousteen
Junior

Další stránka

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 2 návštevníků