Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание невизуального компонента 
:(
    Опции темы
bagos
Дата 6.12.2009, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 275
Регистрация: 17.6.2006

Репутация: 1
Всего: 1



Нужно создать невизуальный компонент. Который должен иметь несколько функций. На вход подается файл с числами и затем используя функции обрабатываем данные числа.

Я вижу так:
у компонента должны быть переменные
path - путь к файлу
list - список чисел
и функции
function func1(list:tstringslist):real
function func2(list:tstringslist):real

начал воять:
Код

type
  TMyStatis = class(TComponent)
  private
    FList:TStringList; -- Список чисел
    FPath:String;    -- Путь к файлу
    { Private declarations }
  protected
    { Protected declarations }
  public
    function Sred(List:TStrings):REal; -- одна из функций
    { Public declarations }
  published
    constructor Create(aowner:Tcomponent);override;
    property Path:string read FPath write FPath; //Свойство
    property List:TStringList read FList write FList;
    { Published declarations }
  end;

procedure Register;
begin
  RegisterComponents('MyComp', [TMyStatis]);
end;

{ TMyStatis }

constructor TMyStatis.Create(aowner: Tcomponent);
begin
inherited create(Aowner);

end;



Для начала попробовал вывести в мемо список чисел из List, но вылетает ошибка :(
Код

MyStatis1.Path := 'e:/xz.txt'; -- задал путь
MyStatis1.List.LoadFromFile(MyStatis1.Path); -- загружаю из файла данные

тут то и вылетает ошибка
Что делаю не так?

Добавлено через 2 минуты и 40 секунд
вопрос решил созданием List := TStringList.Create; в конструкторе
PM MAIL   Вверх
THandle
Дата 6.12.2009, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



Цитата(bagos @  6.12.2009,  17:24 Найти цитируемый пост)
вопрос решил созданием List := TStringList.Create; в конструкторе 


Если вопрос решен то не плохо бы помечать тему соответствующим флажком  smile 
PM   Вверх
bagos
Дата 7.12.2009, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 275
Регистрация: 17.6.2006

Репутация: 1
Всего: 1



Вот что в итоге получилось:
Код

unit MyStatis;

interface

uses
  SysUtils, Classes,math;

type
  TMyStatis = class(TComponent)
  private
    FList:TStringList;
    FPath:String;
    { Private declarations }
  protected
    { Protected declarations }
  public
    function MatOg(List:TStringList):REal;
    function Disper(List:TStringList):Real;
    { Public declarations }
  published
    constructor Create(aowner:Tcomponent);override;
    property Path:string read FPath write FPath; //Свойство
    property List:TStringList read FList write FList;
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MyComp', [TMyStatis]);
end;

{ TMyStatis }

constructor TMyStatis.Create(aowner: Tcomponent);
begin
inherited create(Aowner);
List := TStringList.Create;
end;

function TMyStatis.Disper(List: TStringList): Real;
var
  i:integer;
  sum:real;
begin
  sum := 0;
  for i:=0 to list.Count-1 do
    sum := sum + sqr(strtofloat(list.Strings[i]));
  result := sum * (1 / list.Count) - sqr(MatOg(List));

end;

function TMyStatis.MatOg(List: TStringList): REal;
var
  i:integer;
  sum:real;
begin
  sum := 0;
  for i:=0 to list.Count-1 do
    sum := sum + strtofloat(list.Strings[i]);
  result := sum * (1 / list.Count);
end;

end.



Вызываю так:
Код

  MyStatis1.Path := 'f:/xz.txt';
  MyStatis1.List.LoadFromFile(MyStatis1.Path);
  label1.Caption := FloatToStr(MyStatis1.MatOg(MyStatis1.List));


Получил по голове со след. комментариями:
1. инкапсулировать вызов загрузки в класс через свойство FileName. 
2. Зачем пользователю выполнить лишние действия? Убрать из параметров методов список.

ниче не понял из комментария
 smile  и  smile 
PM MAIL   Вверх
Beltar
Дата 7.12.2009, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 0
Всего: 7



Цитата

вопрос решил созданием List := TStringList.Create; в конструкторе


А теперь убей его в деструкторе.   smile  

Цитата

Получил по голове со след. комментариями:
1. инкапсулировать вызов загрузки в класс через свойство FileName. 
2. Зачем пользователю выполнить лишние действия? Убрать из параметров методов список.


Ты работаешь с внутренним списком, он может просто в private сидеть и быть пользователю недоступен. Пользователь в идеале не должен даже думать о его существовании. А загрузка файла может осуществляться даже в сеттере Path, лучше, на самом деле FileName назвать.

Код

property Path:string read FPath write SetPath; //Свойство
property onLoadFile:TNotifyEvent read FonLoadFile write FonLoadFile;
//
procedure TMyStatis.SetPath(const Value:String);
begin
FPath:=Value;//Без проверки на равенство, вдруг файл изменился, хотя для этого можно ввести метод Reload\Refresh или типа того.
FList.LoadFromFile(FPath);
{Если парсинг достаточно простой, то его можно сделать тут же, не дожидаясь команды сверху}
if Assigned(FonLoadFile) then FonLoadFile(Self);//Как-то же надо с внешним миром взаимодействовать.
end;


Это сообщение отредактировал(а) Beltar - 7.12.2009, 08:41


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
THandle
Дата 7.12.2009, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



Цитата(bagos @  7.12.2009,  02:52 Найти цитируемый пост)
1. инкапсулировать вызов загрузки в класс через свойство FileName. 


Это что-то вроде того что предложил Beltar. Только я бы в его методе использовал блок try... Вдруг ощибка выйдет какая при загрузке?

Цитата(bagos @  7.12.2009,  02:52 Найти цитируемый пост)
2. Зачем пользователю выполнить лишние действия? Убрать из параметров методов список.


Видимо имеется ввиду что в методах:

Код

function TMyStatis.MatOg(List: TStringList): REal;

function TMyStatis.Disper(List: TStringList): Real;


параметр List не нужен - следует работать с создаваемым внутри класса FList'ом.

Да, еще. Оформление кода оставляет желать лучшего.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0473 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.