• Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

Помощь в коде Delphi, Android и файлы

Люцеферон

Принятый Кодер
Регистрация
9 Янв 2021
Сообщения
2
Баллы
28
Люди добрые помогите разобраться. Смысл следующий при первом запуске должен отобразиться выбор из списка после выбора пользователем одного из пунктов combobox прячется и отображается webbrowser при этом должен сохраниться файл настроек и при следующем запуске приложения combobox уже не отображается а в браузер загружается адрес который был выбран при первом запуске(должен браться из файла). Собираю все это дело под windows все работает отлично. Собираю под андроид не работает(при выборе пункта combobox'а ни чего не происходит). Пробовал так же сохранять конфигурацию формы при помощи юнита SaveStateHelper (взят от сюда https://github.com/jimmckeeth/SaveStateSamples ) тоже самое под виндой файл с описанием свойства компонентов сохраняется и при следующем запуске удачно подгружается а под андроидом нет файла. Все проверял на Android 8. Вот исходник первого варианта в котором использую юнит CCR.PrefsIniFile ( https://drive.google.com/file/d/1qWbSiaTOatSNLBvhdB1nQm94GYXp7a6I/view?usp=sharing )

Код:
procedure TMainForm.ComboEdit1Change(Sender: TObject);
begin
if ComboEdit1.ItemIndex=0 then
begin
FIniFile.WriteString('cyticonf','cyti','https://сайт.ru/город1/');
MainForm.WBMain.url:='https://сайт.ru/город1/';
end;
if ComboEdit1.ItemIndex=1 then
begin
FIniFile.WriteString('cyticonf','cyti','https://сайт.ru/город2/');
MainForm.WBMain.url:='https://сайт.ru/город2/';
end;
if ComboEdit1.ItemIndex=2 then
begin
FIniFile.WriteString('cyticonf','cyti','https://сайт.ru/город3/');
MainForm.WBMain.url:='https://сайт.ru/город3/';
end;
if ComboEdit1.ItemIndex=3 then
begin
FIniFile.WriteString('cyticonf','cyti','https://сайт.ru/город4/');
MainForm.WBMain.url:='https://сайт.ru/город4/';
end;
FIniFile.UpdateFile;
ComboEdit1.Visible:=false;
WBMain.Visible:=true;
end;
procedure TMainForm.FormShow(Sender: TObject);
begin
if Tfile.exists(finifile.FileName) then
begin
WBMain.URL:=FIniFile.ReadString('cyticonf','cyti', '');
WBMain.Visible:=true;
ComboEdit1.Visible:=false;
end
else
begin
WBMain.Visible:=false;
ComboEdit1.Visible:=true;
Label1.Text:=finifile.FileName;//для понимания где хранится файл(при выполнении пустой)
end;
При использовании SaveStateHelper поставил просто чекбокс на форму чтобы проверить и прописал

Код:
procedure TMainForm.FormCreate(Sender: TObject);
begin
LoadFormState;
end;
procedure TMainForm.FormSaveState(Sender: TObject);
begin
SaveFormState;
end;
этот код просто запоминает состояние чекбокса и при следующем запуске восстанавливает то значение которое было в момент закрытия. И опять же под виндой работает под андроидом нет. Уже кучу материала перекопал ни чего понять не могу что не так.
 
Люди добрые помогите разобраться. Смысл следующий при первом запуске должен отобразиться выбор из списка после выбора пользователем одного из пунктов combobox прячется и отображается webbrowser при этом должен сохраниться файл настроек и при следующем запуске приложения combobox уже не отображается а в браузер загружается адрес который был выбран при первом запуске(должен браться из файла). Собираю все это дело под windows все работает отлично. Собираю под андроид не работает(при выборе пункта combobox'а ни чего не происходит). Пробовал так же сохранять конфигурацию формы при помощи юнита SaveStateHelper (взят от сюда https://github.com/jimmckeeth/SaveStateSamples ) тоже самое под виндой файл с описанием свойства компонентов сохраняется и при следующем запуске удачно подгружается а под андроидом нет файла. Все проверял на Android 8. Вот исходник первого варианта в котором использую юнит CCR.PrefsIniFile ( https://drive.google.com/file/d/1qWbSiaTOatSNLBvhdB1nQm94GYXp7a6I/view?usp=sharing )

Код:
procedure TMainForm.ComboEdit1Change(Sender: TObject);
begin
if ComboEdit1.ItemIndex=0 then
begin
FIniFile.WriteString('cyticonf','cyti','https://сайт.ru/город1/');
MainForm.WBMain.url:='https://сайт.ru/город1/';
end;
if ComboEdit1.ItemIndex=1 then
begin
FIniFile.WriteString('cyticonf','cyti','https://сайт.ru/город2/');
MainForm.WBMain.url:='https://сайт.ru/город2/';
end;
if ComboEdit1.ItemIndex=2 then
begin
FIniFile.WriteString('cyticonf','cyti','https://сайт.ru/город3/');
MainForm.WBMain.url:='https://сайт.ru/город3/';
end;
if ComboEdit1.ItemIndex=3 then
begin
FIniFile.WriteString('cyticonf','cyti','https://сайт.ru/город4/');
MainForm.WBMain.url:='https://сайт.ru/город4/';
end;
FIniFile.UpdateFile;
ComboEdit1.Visible:=false;
WBMain.Visible:=true;
end;
procedure TMainForm.FormShow(Sender: TObject);
begin
if Tfile.exists(finifile.FileName) then
begin
WBMain.URL:=FIniFile.ReadString('cyticonf','cyti', '');
WBMain.Visible:=true;
ComboEdit1.Visible:=false;
end
else
begin
WBMain.Visible:=false;
ComboEdit1.Visible:=true;
Label1.Text:=finifile.FileName;//для понимания где хранится файл(при выполнении пустой)
end;
При использовании SaveStateHelper поставил просто чекбокс на форму чтобы проверить и прописал

Код:
procedure TMainForm.FormCreate(Sender: TObject);
begin
LoadFormState;
end;
procedure TMainForm.FormSaveState(Sender: TObject);
begin
SaveFormState;
end;
этот код просто запоминает состояние чекбокса и при следующем запуске восстанавливает то значение которое было в момент закрытия. И опять же под виндой работает под андроидом нет. Уже кучу материала перекопал ни чего понять не могу что не так.


производишь проверку на тот самый файл, если он есть значит считываем с него иначе с сервера, если я правильно понял
 
В общем после всех манипуляций получил такой код

Код:
unit uMain;
 
interface
 
uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.WebBrowser, FMX.Controls.Presentation, System.JSON, System.IOUtils;
 
type
  TFMain = class(TForm)
    PMain: TPanel;
    PConf: TPanel;
    WBMain: TWebBrowser;
    BOK: TButton;
    RBBor: TRadioButton;
    RBKay: TRadioButton;
    RBKros: TRadioButton;
    RBZel: TRadioButton;
    LCity: TLabel;
    procedure BOKClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure zelcheck;
    procedure kaycheck;
    procedure kroscheck;
    procedure borcheck;
    procedure readparam;
    procedure paramthereis;
    procedure defaultconf;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  FMain: TFMain;
  ConfFileName: string;
  AOptions: TJSONObject;
  AGroup: TJSONObject;
  AParam: TJSONValue;
  APair: TJSONPair;
  AParamz,AParamk,AParamb,AParamkr: TJSONValue;
implementation
 
{$R *.fmx}
 
procedure TFMain.zelcheck;
begin
   PConf.Visible:=false;
   PMain.Visible:=true;
   WBMain.Visible:=true;
   WBMain.URL:='https://сайт/1/';
end;
 
procedure TFMain.kaycheck;
begin
   PConf.Visible:=false;
   PMain.Visible:=true;
   WBMain.Visible:=true;
   WBMain.URL:='https://сайт/2/';
end;
 
procedure TFMain.kroscheck;
begin
   PConf.Visible:=false;
   PMain.Visible:=true;
   WBMain.Visible:=true;
   WBMain.URL:='https://сайт/3/';
end;
 
procedure TFMain.borcheck;
begin
   PConf.Visible:=false;
   PMain.Visible:=true;
   WBMain.Visible:=true;
   WBMain.URL:='https://сайт/4/';
end;
 
procedure TFMain.readparam;
begin
   AParamz := AGroup.GetValue('zel');
   AParamk := AGroup.GetValue('kay');
   AParamb := AGroup.GetValue('bor');
   AParamkr := AGroup.GetValue('kros');
end;
 
procedure TFMain.paramthereis;
begin
   RBZel.IsChecked := AParamz is TJSONTrue;
   if RBZel.IsChecked then
     zelcheck
     else
     begin
        RBbor.IsChecked := AParamb is TJSONTrue;
        if RBbor.IsChecked then
           borcheck
        else
        begin
           RBkay.IsChecked := AParamk is TJSONTrue;
           if RBkay.IsChecked then
             kaycheck
           else
           begin
             RBkos.IsChecked := AParamkr is TJSONTrue;
             if RBkos.IsChecked then
               kroscheck;
           end;
        end;
     end;
   exit;
end;
 
procedure TFMain.defaultconf;
begin
   PConf.Visible:=true;
   PMain.Visible:=false;
   WBMain.Visible:=false
end;
 
procedure TFMain.BOKClick(Sender: TObject);
begin
   AOptions := TJSONObject.Create;
   AGroup := TJSONObject.Create;
 
   if RBZel.IsChecked=false or RBKay.IsChecked=false or
      RBKros.IsChecked=false or RBBor.IsChecked=false then
   begin
       if RBZel.IsChecked then
       begin
          zelcheck;
          AGroup.AddPair('zel', TJSONTrue.Create);
       end
       else
          AGroup.AddPair('zel', TJSONFalse.Create);
       if RBKay.IsChecked then
       begin
          kaycheck;
          AGroup.AddPair('kay', TJSONTrue.Create);
       end
       else
          AGroup.AddPair('kay', TJSONFalse.Create);
       if RBKros.IsChecked then
       begin
          kroscheck;
          AGroup.AddPair('kros', TJSONTrue.Create);
       end
       else
          AGroup.AddPair('kros', TJSONFalse.Create);
       if RBBor.IsChecked then
       begin
          borcheck;
          AGroup.AddPair('bor', TJSONTrue.Create);
       end
       else
          AGroup.AddPair('bor', TJSONFalse.Create);
   end
   else
      ShowMessage('Сначала нужно выбрать город');
 
   AOptions.AddPair('city', AGroup);
 
   TFile.WriteAllText(ConfFileName, AOptions.ToString);
 
end;
 
procedure TFMain.FormCreate(Sender: TObject);
begin
   {$IFDEF ANDROID}
   ConfFileName := TPath.Combine(TPath.GetDocumentsPath, 'Options.json');
   {$ENDIF}
   {$IFDEF MSWINDOWS}
   ConfFileName := ExtractFilePath(ParamStr(0)) + 'Options.json';
   {$ENDIF}
end;
 
procedure TFMain.FormShow(Sender: TObject);
begin
  if FileExists(ConfFileName) then
  begin
    AOptions := TJSONObject(TJSONObject.ParseJSONValue(TFile.ReadAllText(ConfFileName)));
 
    AGroup := TJSONObject(AOptions.GetValue('city'));
    if AGroup <> nil then
    begin
      readparam;
      if AParamz <> nil then
        paramthereis
      else exit;
    end
    else
      defaultconf;
  end
  else
    defaultconf;
end;
 
end.
все это дело собранно на Rad Studio 10.3, SDK 25.2.5, NDK-r17b собрал все это дело в апк установил на телефон(honor7c на 8 андроиде) все работает отлично и без проблем. залил на эмулятор(bluestack) висит на заставке, на телефоне самсунге(10андроид) тож виси. на 9 хоноре с 8 андроидом на борту - висит. Может подскажите куда копать? получается из всех устройств работает только на моем телефоне) Хотелось бы чтобы работало везде)
 
попробуй поставить другой сдк, щас тебе не могу сказать какой самый новый так как не у компа, но проблема решается версией сдк
 
Вверх Снизу