Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.09.2012, 09:13
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию Проблема с передачей параметров в функцию

Код:
if TryStrToFloat(LabeledEdit1.Text,unit1.stk) then

Выдаёт ошибку: there is no overloaded version of 'trystrtofloat' that can be called with these arguments
__________________
Может быть, я и левша, но я всегда прав!
Ответить с цитированием
  #2  
Старый 04.09.2012, 09:16
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
var
  f: Double;
begin
  TryStrToFloat(Edit1.Text, f);
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 04.09.2012, 09:37
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

Помогло. А не подскажете почему? Что double что real поддерживают 15 знаков (в их описании отличий нет)
__________________
Может быть, я и левша, но я всегда прав!
Ответить с цитированием
  #4  
Старый 04.09.2012, 09:41
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

потому что:
Цитата:
Delphi syntax:

function TryStrToFloat(const S: string; out Value: Extended): Boolean; overload;

function TryStrToFloat(const S: string; out Value: Double): Boolean; overload;
function TryStrToFloat(const S: string; out Value: Single): Boolean; overload;

function TryStrToFloat(const S: string; out Value: Extended; const FormatSettings: TFormatSettings): Boolean; overload;

function TryStrToFloat(const S: string; out Value: Double; const FormatSettings: TFormatSettings): Boolean; overload;
function TryStrToFloat(const S: string; out Value: Single; const FormatSettings: TFormatSettings): Boolean; overload;
нет Real
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 04.09.2012, 17:11
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

Спасибо за ответ.

Чтобы не делать новой темы и не сильно думать ещё спрошу.
В double для разделения целой и дробной части используется точка? Как реализовать автозамену запятой на точку? (Или наоборот, если запятая)
__________________
Может быть, я и левша, но я всегда прав!
Ответить с цитированием
  #6  
Старый 04.09.2012, 17:18
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от R-18Rus
Спасибо за ответ.

Чтобы не делать новой темы и не сильно думать ещё спрошу.
В double для разделения целой и дробной части используется точка? Как реализовать автозамену запятой на точку? (Или наоборот, если запятая)
Если в самом исходнике, то используется исключительно точка.
Если при вводе/выводе, то используется тот символ, который настроен у тебя в Windows (в региональных настройках). В программе можно использовать переменную DecimalSeparator. Пример:
Код:
procedure TForm1.ButtonClick(Sender: TObject);
begin
  ShowMessage(FloatToStr(1.234));
  DecimalSeparator := '*';
  ShowMessage(FloatToStr(1.234));
end;
Ответить с цитированием
  #7  
Старый 04.09.2012, 20:03
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

poli-smen, что Вы имеете ввиду под регионом windows? Отчего он может зависеть? Пока прогу использую только я, но, может быть, будет кто-нибудь ещё.

Про сепаратор: То есть я перед TryStrToFloat должен вставить DecimalSeparator:='.'? И тогда делитель всегда будет точка?
__________________
Может быть, я и левша, но я всегда прав!
Ответить с цитированием
  #8  
Старый 04.09.2012, 22:38
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Имеется в виду настройки разделителя в Windows под конкретную страну или какие установили при инсталляции.

я левша, но не всегда прав.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #9  
Старый 05.09.2012, 08:24
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

Ну у большинства будут российские параметры всё равно.
__________________
Может быть, я и левша, но я всегда прав!
Ответить с цитированием
  #10  
Старый 05.09.2012, 09:13
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от R-18Rus
poli-smen, что Вы имеете ввиду под регионом windows? Отчего он может зависеть? Пока прогу использую только я, но, может быть, будет кто-нибудь ещё.
На панели управления есть "Язык и региональные стандарты". Там же можно установить другой разделитель. Но только на своём компьютере. Вряд ли пользователи будут в восторге если какая-то программа будет самовольно перенастраивать их настройки.
Цитата:
Сообщение от R-18Rus
Про сепаратор: То есть я перед TryStrToFloat должен вставить DecimalSeparator:='.'? И тогда делитель всегда будет точка?
Только если в разных местах приложения используются разные разделители. Если же везде нужен один разделитель, то достаточно один раз установить (например в OnCreate главной формы).
Ответить с цитированием
  #11  
Старый 05.09.2012, 11:03
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

Решил не создавать новую тему, проблема тоже с передачей параметра в функцию. Задача такая:
Есть bpl пакет:
Код:
unit ULogin;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, DBClient, Provider, ADODB, UDataModule;

type
  TFLogin = class(TForm)
    Edit_EmployeeId: TEdit;
    Edit_EmployeePass: TEdit;
    Label_EmployeeId: TLabel;
    Label_EmployeePass: TLabel;
    BtnOK: TButton;
    Btn_Close: TButton;
    procedure BtnOKClick(Sender: TObject);
    procedure Btn_CloseClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
end;

procedure ExecuteModal;
function FamilyName: string;
function PluginName: string;

implementation

{$R *.dfm}

.....

procedure ExecuteModal;
var
  FLogin:TFLogin;
begin
  FLogin:= TFLogin.Create(Application);
  FLogin.Hide;
  FLogin.Showmodal;
end;

exports
  ExecuteModal;

end.

из главной формы по нажатию кнопки вызывается процедура, расположенная в DataModule, из которой вызывается запуск и загрузка bpl пакета:
Код:
unit UDataModule;

interface

uses
  Windows, Messages, SysUtils,Classes,Dialogs, DB, ADODB, IniFiles;

type
  TExecuteModal = procedure;

  TDM = class(TDataModule)
    Query: TADOQuery;
    DataSet: TADODataSet;
    procedure DataModuleCreate(Sender: TObject);
  private
  public
  end;

procedure LoadPlugin(PlName:String; H:HWND; Par:string);

const
  MY_MESSAGE = WM_USER + 1;

var
  DM: TDM;
  ParentHandle:HWND;

implementation

{$R *.dfm}

.....

//---------------------------ЗАГРУЗКА ПЛАГИНА
procedure LoadPlugin(PlName:String; H:HWND; Par:string);
var
  Plugin : HModule;
  FamilyName : TFamilyName;
  PluginName : TPluginName;
  ExecuteModal : TExecuteModal;

  ServerPath,
  ServerPluginPath,
  LocalPluginPath,
  PluginFileName:string;
  MyIniFile:TInifile;
begin
  //Получаем путь к серверу из файла настроек
  MyIniFile := TIniFile.Create(GetCurrentDir+'\cfg.ini');
  ServerPath := MyIniFile.ReadString('General', 'ServerPath', 'not found');
  MyIniFile.Free;

  ServerPluginPath:=ServerPath+PlName+'.bpl';
  LocalPluginPath:=GetCurrentDir+'\'+PlName+'.bpl';
  PluginFileName:=PlName+'.bpl';

  //Пробуем обновить с сервера
  if not CopyFile(PChar(ServerPluginPath), PChar(LocalPluginPath), false) then
  begin
    showmessage('Не получилось обновить '+PluginFileName+' с сервера');
  end;

  //Ищем в папке с программой
  if FileSearch(PChar(PluginFileName), GetCurrentDir)='' then
  begin
    showmessage('Локальная копия '+PluginFileName+' не найдена');
    //Если модуль логина не найден - закрываем всю программу
    if PlName='Login' then SendMessage(ParentHandle, WM_DESTROY, 0,0); //FMain.Close;
  end;

  //Пробуем загрузить плагин в память
  try
    Plugin := LoadPackage(PluginFileName);
  except
    showmessage('Ошибка загрузки '+PluginFileName+' в память');
    //Если модуль логина невозможно загрузить - закрываем всю программу
    If PlName='Login' then SendMessage(ParentHandle, WM_DESTROY, 0,0); //FMain.Close;
  end;

  //Если плагин загружен, пытаемся найти функции и процедуры
  if Plugin <> 0 then
  try
    @FamilyName := GetProcAddress(Plugin,'FamilyName');
    @PluginName := GetProcAddress(Plugin,'PluginName');
    @ExecuteModal := GetProcAddress(Plugin,'ExecuteModal');
  except
    ShowMessage ('Невозможно найти процедуры и функции плагина '+PluginFileName);
  end;

  //Если процедуры и функции найдены, проверяем его версию и принадлежность к программе
  if Assigned(FamilyName) then
  begin
    if (FamilyName<>'TPMDocs') then
    begin
      Showmessage('Ошибка 01. Левый плагин '+PLName); //Плагин не принадлежит TPMDocs
      UnloadPackage(Plugin);
      If PlName='Login' then SendMessage(ParentHandle, WM_DESTROY, 0,0); //FMain.Close;
    end;
  end;

  If Assigned(PluginName) then
  begin
    if (PluginName<>PlName) then
    begin
      Showmessage('Ошибка 02. Левый плагин '+PLName); //Имя плагина не соответствует имени файлв
      UnloadPackage(Plugin);
      If PlName='Login' then SendMessage(ParentHandle, WM_DESTROY, 0,0); //FMain.Close;
    end;
  end;

  if Assigned(ExecuteModal) then
  begin
    ParentHandle:=H;
    msgtochild:=txtmsg;
    ExecuteModal;
  end;
end;


end.

Вопрос - как в ExecuteModal передать параметр?
хотел сделать так: ExecuteModal(Par:string), но в DataModule не понятно где это параметр объявлять. В разделе type не понятно как объявить, там только TExecuteModal = procedure;
Как в модуле DataModule объявить процедуру с параметром? В самом модуле с этим проблем не возникло....

Последний раз редактировалось sorockinalex, 05.09.2012 в 11:06.
Ответить с цитированием
  #12  
Старый 05.09.2012, 12:30
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

Разобрался. Просто в дата модуле нужно вверху в объявлении сделать так: TExecuteModal = procedure (Par:string);
Естественно, в самом пакете тоже нужно процедуру с параметром объявить...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:50.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025