Diskuze: knihovna Javavcl a vývoj pro Android

Člen

Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
Mám v souvislosti s touto knihovnou problém. Nemohu přijít na to, proč
mi příkazy pro vytváření souboru a ukládání textu nefungují. Soubor se
nevytváří. Upravil jsem projekt Lovecalc. Poslal bych rád celý projekt, ale
naneštěstí nemohu vkládat .zip soubory. Takže kdyby mi někdo chtěl
pomoci, stačí mít nainstalován Lazarus nejnovější verzi, a do
rozzipovaného adresáře s knihovnou vložit obsah zdrojového textu z mého
příspěvku přepsat ve složce
\javavcl-code-1007\lpr\android\lovecalc\src\mainform.pas
V Lazarusu je nutné otevřít lpr soubor. Pak stisknout CTRL+SHIFT+F9 a je
zahájena kompilace projektu.
unit MainForm;
{$mode objfpc}
{$H+}
interface
uses _System, Classes, Controls, Dialogs, Forms, GenChars, LCLIntf, Menus, StdCtrls, SysUtils;
type
TFormMain = class(TForm)
strict private
LEditName1, LEditName2: TEdit;
LButtonCalc: TButton;
protected
procedure ButtonClick(A: TObject);
public
constructor Create(A: TComponent); override;
end;
var
FormMain: TFormMain;
f: TextFile;
implementation
constructor TFormMain.Create(A: TComponent);
begin
inherited;
Caption := Application.Title;
LEditName1 := TEdit.Create(Self);
LEditName1.ClientWidget.setBackgroundColor($88000000);
LEditName1.Align := alTop;
LEditName1.Parent := Self;
LEditName2 := TEdit.Create(Self);
LEditName2.ClientWidget.setBackgroundColor($88000000);
LEditName2.Align := alTop;
LEditName2.Parent := Self;
LButtonCalc := TButton.Create(Self);
LButtonCalc.Caption := 'Uložit text';
LButtonCalc.Align := alTop;
LButtonCalc.Parent := Self;
LButtonCalc.OnClick := @ButtonClick;
(*
)
(
*)
end;
procedure TFormMain.ButtonClick(A: TObject);
begin
if A is TMenuItem then begin
TMenuItem(A).Checked := not TMenuItem(A).Checked;
end;
if A = LButtonCalc then begin
AssignFile(F,LEditName2.Text);
rewrite(F);
writeln(F,LEditName1.Text);
CloseFile(F);
end;
end;
end.
Já co by nevidomý bez zbytků zraku na knihovně oceňuji to, že nemusím nezbytně nutně zadávat údaje v pixelech při tvorbě GUI aplikace.
Toho lze dosáhnout ve velké míře i u normálních VCL aplikací přes položku Align.
problém se souborem
Jakou dostáváte běhovou chybu? Nevidím nikde vypnutou kontrolu I/O operací, takže by volání rewrite mělo skončit výjimkou. Případně po volání Rewrite mrkněte ha nodnotu proměnné IOResult. Nula znamená úspěch, ostatní hodnoty jsou chyby udávající, co je za problém.
Jinak doporučuju zkusit uvést jméno souboru absolutně. Tenhle problém tedy není problémem oné knihovny, protože dané procedury pro práci se soubory jsou součástí jádra Delphi/Lazaru/FPC.
Mnohokrát děkuji za dobrou radu. Pokusím se pomocí /sdcart/soubor.txt
zkusit zadat jméno souboru přímo.
Ano, máš pravdu, jsou to interní příkazy Free Pascal kompilátoru. Já dal
odkaz na celý projekt s knihovnou proto, aby to bylo možné případně
vyzkoušet. Moc se mi líbí, že autor dodal celou řadu jednotek, které
dovolují i detekovat stisk jednotlivých kláves, jak dlouho byla určitá
klávesa podržená a na jak dlouho. Oceňuji i to, že výsledné aplikace jsou
plně přístupné s odečítačem obrazovky Talkback. Navíc díky překladu
programu do Dex formátu a bez využívání C knihoven je šance, že programy
poběží na různých verzích Androidu svižněji. Škoda, že autor
nevytvořil dokumentaci k funkcím a procedurám. Budu si muset pomoci sám a
projít si funkce a procedurky a otestovat je. Moc děkuji za radu a pomoc.
Mám na Vás laskavé specialisty jednu novou prosbičku. Pomohla mi rada ohledně ukládání souborů a už program pracuje jak má. Rád bych přišel na to, zda-li je možné nějakým příkazem v Pascalu v souvislosti s touto knihovnou přiřadit určitému editačnímu políčku návěští. Naneštěstí, Caption vkládá do editačního pole text, který je nutné smazat. Já bych ale toužil po funkci, která by editační pole pojmenovala, přiřadila by mu návěští, které by však nefungovalo tak, že se text názvu před připraví jako text dovnitř příslušného editačního pole. Caption se chová korektně u jiných prvků GUI aplikací, jakými jsou přepínače, zaškrtávací tlačítka, tlačítka. Nebo mám smůlu a Android něco takového u editačních polí principiálně nedovoluje? Nevidící právě mají nejraději, když je každý prvek opatřen návěštím. Jsem si vědom, že se problém dá řešit i jinak, například použitím třídy Textview, jejíž hodnota bude obsahovat návěští prvku. Přiznám se, že mé znalosti nitra Androidu nejsou natolik profesionální, abych si troufl smysluplně zasahovat do .inc a .pas souborů, které jsou součástí knihovny JavaVcl, abych případně Caption vylepšil, je-li to vůbec možné.
Co si přesně představujete pod pojmem návěští? Pokud potřebujete textové pole (edit), před kterým bude napsáno ono návěští (podobně jako třeba je za zaškrtávacím políčkem), tak něco takového textové pole (TEdit) obecně neumí. U textového pole se obvykle tato vlastnost (jeho obsah) ani nejmenuje Caption, ale Text.
V "novějších" Delphi pro tyto účely je k dispozici komponenta TLabelledEdit, která kombinuje schopnosti TLabel (Capton) s testovým polem (TEdit, Text). Nějak mi ale nikdy nepřirostla moc k srdci. Obvykle se prostě uchyluji k manuálnímu pozicování TLabel a TEdit tak, aby vypydaly, že patří k sobě.
Je pravda, že pak musím pozicovat přímo na pixely, aby vše nějak
vypadalo, což nechcete. Dalo by se to obejít, ale vyžadovalo by to každou
dvojici TLabel a TEdit umístit do jednoho kontenerového prvku (například
TPanel, TGroupBox...), na což jsem dost líný .
Vážený pane Drábe,
Prosím prosím, nevíte, jak používat procedury a funkce uvnitř .inc
souborů, které jsou součástí této knihovny?
Ačkoli jsem příslušnou programovou jednotku uvedl v příkazu uses v
mainform.pas, dostávám od kompilátoru chybové hlášení, že identifikátor
neexistuje, když jí zkouším volat.
uses _System, Classes, Controls, Dialogs, Forms, GenChars, LCLIntf, Menus,
StdCtrls, SysUtils, androidr22;
Třeba procedura
procedure play(); overload; virtual; // throws
java.lang.IllegalStateException
když jí volám
play ('http://icecast8.play.cz/cro1-128.mp3');
Tak se to kompilátoru nezamlouvá.
Je mi smutno, že nedovedu pochopit, jak třeba začít přehrávat live stream.
Ten Pascal mě tak přitahuje, ale pochopit volání těch procedurek a funkcí
v programových jednotkách, to není jen tak.
Jednotka se nalézá v tomto souboru.
C:\javavcl-code-1007\javavcl-code-1007\fpc\units\jvm-android\rtl\androidr22.inc
Je mi i jasné, že do Androidmanifest.xml pro poslech Internetového rádia
musím přidat oprávnění pro přístup k Internetu, to si doplním do
manifestu. Pořád přemýšlím, které knížky by bylo dobré si prostudovat,
abych programové jednotky pochopil a uměl funkce a procedury samostatně volat
a zkoušet.
Moc děkuji za Vaši trpělivost. Jste jediný, kdo mi ochotně a účinně
pomohl.
Zkusím se na to podívat zítra či během víkendu. Stáhnu si tu knihovnu a prozkoumám ji (nevím, zda se mi podaří vyzkoušet na Androidu, neb mám s ním jen jedno zařízení, které jsem naposledy použil před lety). Nicméně, alespoň mrknu do zdrojáků té knihovny.
Co se týče .inc souborů, těch byste si neměl všímat. Do jednotek (.pas) se obvykle vkládají direktivou $I, například pro vložení souboru example.inc na určité místo se na tomto místě použije:
{$I example.inc}
Je to prostě pascalová obdoba Cčkového
#include "example.inc"
Počítám, že ty .inc sioubory jsou již vloženy do příslušných jednotek té knihovny, takže byste se o ně neměl starat (překladač je bude vidět tam, kde jsou vloženy).
Každopádně to zkusím prozkoumat (Lazarus občas používám, takže s tím není problém).
jestli se dobře dívám na tu proceduru play, jedná se o toto:
procedure play(); overload; virtual; // throws
java.lang.IllegalStateException
Jestli se dobře dívám, tak tato procedura je vlastně metodou třídy
AMAudioTrack, což je důvod, proč překladač tvrdí, že neexistuje. Ale
jelikož ta třída je dosti dlouhá, tak se nedivím, že vás to zmátlo.
Koukám, že ty třídy jsou vlastně jenom importy z Javy, a proto tam není žádná dokumentace. Dokumentaci lze nalézt pro jejich javové protějšky (obvykle za jménem třídy po slově class je napsán +- název toho protějšku). U této třídy to zjevně je android.media.AudioTrack.
Takže pro zavolání té metody play bude potřeba vytvořit a inicializovat instanci třídy AMAudioTrack.
Á, děkuji za podporu a za vysvětlení. Já za to nemohu, že mi ten Pascal tak přirostl k srdci.
Zobrazeno 10 zpráv z 10.