Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.221.53.209] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток не могли Вы помочь разобраться почему не работает компонент на Delphi.
Задача: создать компонент в котором указываем путь к текстовому файлу с данными, он добавляет все данные в массив и потом позволяет получить выбранный пользователем элемент массива. Просто программу которая всё это делает мне смастерить удалось а вот компонент компилится, но не работает. Прикрепляю рабочую прогу, и компонент. Если что-то непонятно коде то спрашивайте я поясню. P.S Компонент делаю первые поэтому возможно что там написан страшный бред заранее извиняюсь не судите строго. Прикреплённый файлProga_component.rar (16,57 Кбайт, скачиваний: 168) |
Сообщ.
#2
,
|
|
|
1) зачем компоненту OD1: TOpenDialog; ведь у него есть свойство FileName
2) зачем ему свойство Active если оно по своей сути никакой пользы не несет. я бы еще понял если бы по весить событие для открытия или закрытия файл по изменению свойства. 3) связь между Access1, ID и Vivod вообще бредовая. намного эффективнее написать: type TTest = class(TComponent) protected function element(ID: Integer): String; // имя функции оставил твое. хотя я бы его назвал //по частичному имени свойства GetViyod что бы не путаться если свойств много public property Viyod[ID: Integer]: String read element; end; function TTest.element(ID: Integer): String; begin // а тут уже то что у тебя было в функции element end; 4) я бы отказался от AssignFile. это пережитки паскаля. в данном случае намного проще было бы заюзать TStringList Добавлено пс. хотя ты изобрел велосипед. подобная логика уже в TStringList а что ты этим хотел сделать. может уже давно в делфи все готовое есть? |
Сообщ.
#3
,
|
|
|
Задание по курсовой такое, хочу для себя во первых норм разобраться, а во-вторых нужно же будет ещё объяснить что у меня к чему). За помощь огромное спс всеми советами воспользовался кроме 4-го, ток пока не пашет я ещё немного с приравниваниями напортачил
|
Сообщ.
#4
,
|
|
|
Цитата Rydj @ аха. тогда нужно оставить AssignFile. препод это оценит. (не знаю почему но большинство преподавателей считают что в делфи нужно писать на паскале, минуя богатые возможности Delphi. но возможно это часть идеи обучения)Задание по курсовой такое ну и небольшая доработка Active (что бы как то на компонент похоже было. ато одна полезная процедура как то не интересно) TTest = class(...) FActive: Boolean; protected procedure SetActive(Value: Boolean); published property Active: Boolean read FActive write SetActive; public procedure Open; procedure Close; end; procedure TTest.Open; begin if Active then Exit; //дальше код который в процедуре OpenRead //и если загрузка прошла удачно то меняем флаг FActive на истину end; procedure TTest.Close; begin Setlength(fData, 0); FActive := false; end; procedure TTest.SetActive(Value: Boolean); begin if FActive = Value then Exit; if Value then Open else Close; end; |
Сообщ.
#5
,
|
|
|
FActive: Boolean; вешать надо наверно в private
и ещё вопросик я вот не пойму а от куда property Vivod[ID: Integer]: String read element; получает ID уж точно не с object inspectora |
Сообщ.
#6
,
|
|
|
Цитата Rydj @ да. я просто забыл написать (пишу код прямо сюда посему могут быть мелкие недочеты)FActive: Boolean; вешать надо наверно в private Viyod не является published посему оно и не будет видно в инспекторе. да оно и не надо там. доступ к нужному элементу массива будет осуществятся: var test: TTest; begin // тут создание test. хотя если компонент будет брошен визуально на форму то создавать не надо ShowMessage(test.Viyod[1]); и тут в месседж будет выведено значения с первым индексом. а если написать свойство так public property Viyod[ID: Integer]: String read element; default; ShowMessage(test[1]); // что немного сокращает код |
Сообщ.
#7
,
|
|
|
С Active компонент теперь действительно похож на компонент спасибо, вот ток доступ к элементам я получить не могу
Button1.Caption:=Ttest.Vivod[1]; получаем Undeclared identifier:'Vivod' Код компонента: type Tknyz = class(TComponent) private { Private declarations } VFileName: string; FActive: Boolean; fData: array of string; //ìàññèâ k:integer; // VID-îáðàùåíèå ê âûáðàííîìó ýëåìåíòó ìàññèâà, k-ìàêñèìàëüíûé ýëåìåíò ìàññèâà protected { Protected declarations } function GetVivod(ID: Integer): String; procedure SetActive(Value: Boolean); public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Open; procedure Close; property Vivod[ID: Integer]: String read GetVivod; published { Published declarations } property Active: Boolean read FActive write SetActive; property FileName: string read VFileName write VFileName; end; procedure Register; implementation function Tknyz.GetVivod(ID: Integer): String; begin if ((ID<0) or (ID>=k) ) then begin messageDlg('Âîò òàê äåëàòü íåëüçÿ!', mtError, [mbOK],0); end else begin Result:=fData[ID]; end; end; |
Сообщ.
#8
,
|
|
|
По идеи должен. сообщение
Цитата Rydj @ говорит о том что компилятор не видит Vivod. Дай полный код компонента + его использования получаем Undeclared identifier:'Vivod' |
Сообщ.
#9
,
|
|
|
unit knyz; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; type Tknyz = class(TComponent) private { Private declarations } VFileName: string; FActive: Boolean; fData: array of string; //массив k:integer; // VID-обращение к выбранному элементу массива, k-максимальный элемент массива protected { Protected declarations } function GetVivod(ID: Integer): String; procedure SetActive(Value: Boolean); public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Open; procedure Close; property Vivod[ID: Integer]: String read GetVivod; published { Published declarations } property Active: Boolean read FActive write SetActive; property FileName: string read VFileName write VFileName; end; procedure Register; implementation function Tknyz.GetVivod(ID: Integer): String; begin if ((ID<0) or (ID>=k) ) then begin messageDlg('Вот так делать нельзя!', mtError, [mbOK],0); end else begin Result:=fData[ID]; end; end; procedure Register; begin RegisterComponents('Standard', [Tknyz]); end; constructor Tknyz.Create(AOwner: TComponent); begin inherited Create(AOwner); end; procedure Tknyz.Open; var f: TextFile; // файл fName: String[80]; // имя файла buf: string[80]; // буфер для чтения из файла begin if Active then Exit; fName:=FileName; if Fname <> '' then begin begin k:=0; AssignFile(f, fName); //{$!-} Reset(f); // открыть для чтения //{$I+} if IOResult <> 0 then begin MessageDlg ('Ошибка доступа к файлу ' + fName, mtError, [mbOk], 0); exit; end; // Считываем файл и заполняем массив while not EOF(f) do begin k:=k+1; Setlength(fData, k); readln(f, buf); // прочитать строку из файла fData[k - 1]:= buf; end; CloseFile(f); // закрыть файл FActive:=true; end end; end; procedure Tknyz.Close; begin Setlength(fData, 0); FActive := false; end; procedure Tknyz.SetActive(Value: Boolean); begin if FActive = Value then Exit; if Value then Open else Close; end; destructor Tknyz.Destroy; begin //уничтожим компонент inherited; end; end. |
Сообщ.
#10
,
|
|
|
емм... работает. попробуй пересобрать компонент. возможно среда видит старый образец компонента.
и еще я заметил что у тебя ни конструктор ни деструктор ничего не делают. посему их можно выбросить из кода. и как по мне то нужно избавится от k:integer; вместо его лучше сделать свойство Count. в методе которого можно узнавать размер через Length Добавлено пс. и на досуге переглянь вот эту статейку Стандарты написания исходного кода в Delphi. придираюсь я насчет Соглашение об именованиях Лучше себя сразу приучить к определенной стандартизации. Потом не придется переучиваться. (Во всех компаниях есть свой стандарт программирования. Который в своем большинстве состоит из набора подобных правил как в статейке) |
Сообщ.
#11
,
|
|
|
а, да работает. Огромное спасибо;)
Добавлено ок почитаю, я знаю что не соблюдаю правила в прошлом семестре прогу на Си сдавал когда препод в коде разобрался сказал что я сатанист |
Сообщ.
#12
,
|
|
|
Цитата Rydj @ Доброго времени суток не могли Вы помочь разобраться почему не работает компонент на Delphi. Задача: создать компонент в котором указываем путь к текстовому файлу с данными, он добавляет все данные в массив и потом позволяет получить выбранный пользователем элемент массива. Кажется, вы пишете TStringList.. непонятно, почему это называется компонентом. Оно визуальное? Или просто на форму кидается? |