Jak użyć Memo.Lines.SaveToFile pod Androidem?

0

Witam . Mam taki problem próbuje użyć czegoś takiego ale pod androidem, jak użyć czegoś takiego

memo1.Lines.SaveToFile('c:\test.txt')

Chodzi mi o to co w nawiasach . Dla win32 spowoduje ze plik test.txt zostanie zapisane na dysku c, a jak to ma być pod androidem . Próbowałem

memo1.Lines.SaveToFile('test.txt')

ale wywala błąd .

0

Witam .

Memo1.Lines.SaveToFile(GetHomePath + '/test.txt') 

takie coś niby błędu nie wywala , ale nie wiem czy i gdzie zapisuje plik test.txt. Czy to może jest zapisane w jakimś ukrytym folderze ? Czy znajdę ten plik jeśli będę przeglądał zawartość telefonu z poziomu Windowsa (usb) ? Czy to będzie się zapisywać w pamięci wewnętrznej czy na karcie SD ?

2

Na pamięci wewnętrznej
Jak wejdziesz w menadżer plików to folder Android/data/%ID APKI%/files
aha jeżeli chodzi o urządzenie mobilne lepiej sprecyzuj z której funkcji GetHomePath chcesz skorzystać czyli napisz:
System.IOUtils.TPath.GetHomePath zamiast GetHomePath bo tak Delphi może przypadkiem użyć System.SysUtils.GetHomePath która nie jest zalecana dla aplikacji multiplatformowych.

0

Ok , poszło . Dziękuje . Mam jeszcze takie pytanie . Co ustawić w właściwościach formy żeby można ją przesuwać palcem po ekranie . tzn jeśli wysokość formy jest większa niż ekran telefonu to część jej jest nie widoczna bo jest poza ekranem .Czy takie przesuwanie palcem trzeba zrobić programowo czy jest do tego jakiś parametr w ustawieniach . Jesli programowo to co odpowiada za pozycje formy na ekranie telefonu . W win32 to jest np .left ale w formie androida tego nie ma ,

1

Od czego masz demka?
http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/FMX.ScrollableForm_Sample

Na ScrollBoxie umieść TLayout a na nim kontrolki to będziesz mógł przewijać.

0

No właśnie na tej stronie wczoraj widziałem fajnie opisane wraz z graficznym opisem jak i co , ale nie widzę teraz tego . Historie przejrzałem i gdzieś wyparowała ta strona . . na razie tego > Na ScrollBoxie umieść TLayout a na nim kontrolki to będziesz mógł przewijać> nie kumam ale to może dlatego ze siedzę przy tym od rana . Jutro na świeży mózg to wezmę .

0

Co tu do kumania w najprostszym wydaniu bierzesz jakiegoś ScrollBox'a np. TVertScrollBox (jeżeli chcesz tylko pionowo) ustawiasz mu Align -> Client na to rzucasz TLayout i ustawiasz sobie jego wielkość (niech sobie będzie wyższy od formy) na nim kładziesz i dopiero na nim kontrolki. Jak tak zrobisz to da się przewijać i będzie ok.

0

:) Poszło ale ,,,,:) Mam na formie miedzy innymi grafikę i memo . Zauważyłem ze jak palec jest na grafice lub memo to nie da się przesunąć formy , poza tym chodzi tak jak trzeba . Jak palec jest na buttonie to tez chodzi ok .A jak teraz mogę przesunąć tą forme programowo ?. Wybacz moje pytania , i ze pytam o rzeczy które można sprawdzić samemu , ale problem w tym ze uruchomienie aplikacji na próbę w telefonie trwa u mnie ok 1.5 minuty , tak ze to czekanie mnie dobija. Całośc sprawdzam pod win32 ale niektóre rzeczy jak np to muszę sprawdzić w telefonie .

0

Ale co chcesz programowo scrollować?
ScrollBox ma metodę ScrollBy ale chyba przydatniejsze jest scrollowanie aby dana kontrolka stała się widoczna (tutaj Edit1).

VertScrollBox1.ViewportPosition := PointF(0, Layout1.Position.Y + Edit1.Position.Y); //1 param 0 bo interesuje nas tylko pionowo a drugie to proste wyliczenie pozycji kontrolki
0

Witam . Możesz jeszcze mi napisać odpowiedniki tego:

Memo1.CaretPos := Point(x, y) ustawia kursor na pozycji x,y ,,, Tak robię w Delphi w aplikacjach pod win32 , Dla androida to wywala błąd .
Czy to memo1.Caret.Pos:=Point(x,y); jest odpowiednikiem tego? W takim przypadku współrzędne x i y nie są współrzędnymi znaków w memo ale chyba w pikselach. .

2
  Memo1.CaretPosition:= TCaretPosition.Create(linia, pozycja); //liczone od 0
  Memo1.SetFocus; //jeżeli trzeba aktywować memo

aha do uses FMX.Memo.Types

0

A jak wstawić tekst w środek innego tekstu w wybrana pozycje ? robię tak:

tablica1.CaretPosition:= TCaretPosition.Create(2,5);
tablica1.SelLength:=0;
tablica1.lines.SetText('tekst');

ale zawartość memo znika i dodany zostaje 'tekst' na pozycji 0,0.

Czy to ma zwracać pozycje kursora w memo:?

tablica1.CaretPosition.pos,
tablica1.CaretPosition.Line
2
Rabbit2 napisał(a):

A jak wstawić tekst w środek innego tekstu w wybrana pozycje ? robię tak:

tablica1.CaretPosition:= TCaretPosition.Create(2,5);
tablica1.SelLength:=0;
tablica1.lines.SetText('tekst');

ale zawartość memo znika i dodany zostaje 'tekst' na pozycji 0,0.

A czego się spodziewałeś SelLength ustawia długość tekstu to pomyśl co spowoduje ustawienie tego na 0 (oczywiście wyczyszczenie)
Ech przeczytałem SETLength... SelLength na 0 oczywiście odznaczy zaznaczony tekst
SetText z kolei zmienia cały tekst na podany jako parametr.

Rabbit2 napisał(a):

Czy to ma zwracać pozycje kursora w memo:?

tablica1.CaretPosition.pos,
tablica1.CaretPosition.Line

Tak

Aby wstawić tekst na wybraną pozycję można (a właściwie powinno się zamiast kombinować na piechotę) użyć metody InsertAfter:

Memo1.InsertAfter(TCaretPosition.Create(linia, pozycja), 'Test do wstawienia', [TInsertOption.MoveCaret, TInsertOption.CanUndo]);
0

Gut . działa. Teraz kolejne :) . Potrzebuje zrobić coś w stylu Showmeesage ale z wyborem tak/nie w VCL było to możliwe w jednej linijce ale tu nie wiem jak . Znalazłem zwykłe okienko info ale tylko z buttonem OK , a ja chce mieć wybór tak/nie . Kolejna rzecz to jest taka opcja w androidzie jak działanie jak w win32 coś w stylu plików .INI , czyli zapisywanie jakiś wartości zmiennych żeby później je odczytać itp, nie sprawdzałem czy pójdzie to tak samo jak w win32 . Następne .. to jak zrobić kontrole błędów tzn , jak coś jest nie tak np chce odczytać plik którego nie ma to aplikacja na telefonie się wyłącza . A jak zrobić żeby pojawiła się informacja o tym ze nie ma pliku tak żeby nie wyrzucało mnie z aplikacji , Sorry za lawinę pytań ale jeśli masz temat opanowany to myślę ze to nie jest jakiś większy problem dla ciebie . Pozdrawiam

0

Zależy jakiego konkretnie dialogu potrzebujesz taki zwykły to chyba najbardziej przypomina zachowaniem:
FMX.DialogService.TDialogService.MessageDialog

    TDialogService.MessageDialog('To jest test', TMsgDlgType.mtConfirmation,
        [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], TMsgDlgBtn.mbNo, 0,

        procedure(const AResult: TModalResult)
        begin
          case AResult of
          mrYes:
            begin
              //kod po tak
            end;
          mrNo:
            begin
              //kod po nie
            end;
          end;
        end

        );

Plik konfiguracyjne... jakiego formatu użyjesz taki będziesz miał ważne aby podawać właściwą ścieżkę do zapisu/odczytu (o tym już była mowa w temacie). Mogą być to nawet pliki INI pod Windows a Androidem w innym formacie ale obsługa pozostaje zbliżona do standardowych TIniFile niestety wbudowany w Delphi moduł ich obsługi (IniFiles) nie zadziała ze względu na użyte tam funkcje WinApi ale ktoś już napisał moduły do ich obsługi FMX.IniFile dla aplikacji mobilnych. Wprawdzie nie testowałem tego rozwiązania ale wygląda, że robi się jak pod Windows.

W Androidzie działa przechwytywanie wyjątków w bloku try except tak samo jak pod Windows (w nowych wersjach Delphi, bo starsze wersje mają z tym problemy pod nowszymi wersjami Androida).

0

Witam .

... ktoś już napisał moduły do ich obsługi FMX.IniFile

ok . Ale jak dodać taki moduł do programu . Rozumiem że do uses dodaje FMX.IniFile , ale chyba trzeba go najpierw dodać do jakiejś biblioteki w delphi ? Jeśli tak to gdzie i co ? Mam pobrać FMX.IniFile.Android.pas , czy FMX.IniFile.pas , czy oba z linka który podałeś i gdzieś go wstawić. ?

0

Nigdy nie korzystałeś z modułów zewnętrznych?
Wszystkie pobierasz albo do folderu z innymi unitami programu albo gdziekolwiek i albo w ustawieniach projektu podajesz ścieżkę w Project -> Options -> Delphi Compiler -> Search path (dla wszystkich konfiguracji) albo w ogóle dla całego środowiska Delphi czyli Tools -> Options -> -Delphi Compiler -> Library -> Library path (też trzeba dodać dla wszystkich).

0

Nigdy nie korzystałeś z modułów zewnętrznych?>

Nie ;) .
Działam amatorsko i na razie wystarcza mi to co jest w standardzie . Zawsze pisałem w VCL , i przypadkiem się wychyliłem że można napisać mała aplikacje na tel która trochę ułatwi życie u mnie w pracy i teraz muszę siedzieć nad tym bo pomysł się spodobał :) Będzie to banalna apka , składająca się z jednego memo , kilku buttonów , zegarka ,zapisu .ini, wysyłki .txt na FTP . Najgorsze jest to że to inaczej wygląda jak uruchomię na win32 a inaczej się zachowuje w niektórych przypadkach na Androidzie. Ale dzięki twoim podpowiedzią pomału czołgam się ku zakończeniu .
Tradycyjnie na koniec małe pytanie: czy jest jakiś prosty sposób na wysłanie np jakiejś ikony na pasek powiadomień w telefonie , kiedy aplikacja będzie zminimalizowana /działa w tle /? .\

I drugie: czy to:

WindowState := TWindowState.wsMinimized;

minimalizuje aplikacje .

..wiem że żaden problem żebym to sobie sprawdzić samemu ale będę mógł to zrobić dopiero wieczorem więc jest szansa że wcześniej dowiem się tego od ciebie .
Dzięki pozdrawiam .

0

Problem w tym, że na Androidzie "pod spodem" wszystko działa diametralnie inaczej niż na desktopie. Inny cykl życia aplikacji, okien itd. Tego nie da się przenieść 1:1, więc tak dobrze nie będzie, że ten sam kod, te same funkcje wywołane tak samo będa działać na Androidzie.

0

..dlatego co chwile sypią się pytania z mojej strony :) mam ich jeszce kilka ale spróbuje sam rozkminić . Jak mi się nie uda to zapytam tutaj .

0

Tools -> Options -> -Delphi Compiler -> Library -> Library path (też trzeba dodać dla wszystkich)>

Nie działa .Pobrałem te cztery pliki i wstawiłem do foldera na pulpicie .Później zrobiłem tak jak napisałeś za każdym razem zmieniając na inna platforme.

screenshot-20171115214001.png

Dodałem do uses
screenshot-20171115214042.png

run i efekt taki .
screenshot-20171115214109.png
co robię nie tak ?

0

Masz jakieś śmieci w FMX.IniFile.pas (i pewnie w innych też) przeglądałeś ten plik? Być może pobrało Ci HTML a nie plik pas.. W załączniku masz poprawne pliki (nawet uaktualniona jedna przestarzała metoda).

0

Rzeczywiście,. Choć pliki miały rozszerzenie.pas to jak otwarłem to w notatniku , pojawił się html. Dziś sprawdzę czy na twoich plikach pójdzie. . Możesz mi jeszcze podpowiedzieć jak zrobić żeby sprawdzić czy plik.txt w podanej lokalizacji istnieje . ? Na wypadek gdyby jednak opcja z .ini mi nie działała, to zrobię to po swojemu na .txt. Dziękuję.

FileExists? Pójdzie w fmx.?

0

System.SysUtils.FileExists chyba działa choć pokroić się za to nie dam ale System.IoUtils.TFile.Exists działa na 100%.

0

Witam

System.IoUtils.TFile.Exists działa na 100%.>

zgadza się działa .:)

.INI też działa ale tylko pod win32 , próbuje uruchomić pod Androidem i error taki jak na zdjeciach .

screenshot-20171117063825.png

screenshot-20171117063845.png

screenshot-20171117063901.png

screenshot-20171117064044.png

Nie wiem co jest . Czy do uses wystarczy tylko dodać fmx.inifile czy FMX.IniFile.Android czy i jedno i drugie , czy coś jeszcze .

uses
  FMX.IniFile;

var
  IniFile: TXplatIniFile;
begin
  IniFile := CreateIniFile('tutaj wstawiłem samą nazwę pliku .ini bez folderów , z folderami wieszało aplikacje przy próbie pod win32'); 
 
  IniFile.ReadString('xx', 'yy', 'default');
end;

Pod win32 działa jak należy .

1

Co do INI i błędu z TAndroidHelper to tam wyżej masz w komentarzu wersję pod starsze Delphi (myślałem że masz jakaś nową wersję a w nowych uznaje tamtą metodę za przestarzałą dlatego zmieniłem na nową) a daj w komentarz na nową.

Do uses tylko FMX.TIniFile

A najlepiej zrób tak

procedure TIniFileAndroid.Init;
begin
  if (FPrefs = nil) then
  {$IFDEF CompilerVersion >= 25}
    FPrefs :=
      TAndroidHelper.Context.getSharedPreferences(
        StringToJString(GetAppName),
        TJContext.JavaClass.MODE_PRIVATE
      );
  {$ELSE}
     FPrefs :=
      SharedActivityContext.getSharedPreferences(
        StringToJString(GetAppName),
        TJContext.JavaClass.MODE_PRIVATE
      );
  {$ENDIF}
end;
0

Mam XE8 . Rozumiem , popołudniu sprawdzę jak będę w domu .Dziękuje .

0

Witam .INI działa ok , dziękuje . Teraz kolejne chyba już ostatnie ja pobrać z internetu plik .txt . Robię tak

 UrlMon.UrlDownloadToFile(nil, 'http://xxxxx.prv.pl/demo/tablica.txt','C:\xrapis\demo\tablicamobilna.txt',0,nil);

.i pobiera się , ale jak plik na serwerze zaktualizuje to w taki sposób pobiera mi stary plik .txt a nie nowy z serwera .

Dzięki .

0

Widocznie jest w pamięci podręcznej nie wiem jak pod Androidem bo pod Windows DeleteUrlCacheEntry myślę że może Indy konkretniej IdHTTP do ściągania by się lepiej sprawdziło.

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