Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Купить рекламу на форуме 15-35 тыс рублей в месяц

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2010, 21:27   #1
-ushёl-
Форумчанин
 
Аватар для -ushёl-
 
Регистрация: 04.02.2009
Сообщений: 141
Вопрос Delphi7,как создать собственный класс ?

Задали создать класс,примерно такого плана
Имя класса Persons(Персоны),в него входят две(так скажем подкласса)персоны:преподаватели и студенты,соответственно первые разделяются на:профессоров,доцентов,ст.преподав ателей и ассистентов, вторые разделяются на(к примеру):отличник,хорошист и двоечник.Каждой персоне присваивается определённый оклад,вознаграждение:к примеру пусть у доцента будет оклад равен 10 золотых притов(10 prit),у доцента 6 золотых притов,ст.препод-3 золотых прит,препод.-2 золотых прит,ассистент-1 прит
Стипендия(оклад) студентов к примеру:отличник-1 серебряный прит,хорошист-1 бронзовый прит,двоечник-0 прит
-ushёl- вне форума Ответить с цитированием
Старый 05.06.2010, 21:58   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,003
По умолчанию

в чем именно проблема?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.06.2010, 23:16   #3
-ushёl-
Форумчанин
 
Аватар для -ushёl-
 
Регистрация: 04.02.2009
Сообщений: 141
По умолчанию

Проблема в том как мне его реализовать в небольшой программе?
Возможно ли организовать выбор(преподавателей и студентов) из MainMenu и при выборе выводилось бы в Label зарплата?
p.s.Да вот задали(как говорится на словах) задание создать любой свой класс... Идей у меня не было и преподаватель предложил свою(объяснив на словах...),

вот примерно такой класс,если его конечно можно классом назвать

Код:
unit Unit_myClass;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus;

type
  TForm1 = class(TForm)
    Label1: TLabel;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
  TPersons = class(TObject)
   public
    teacher: string;//prepodav
    proff:string;
    dozent:string;
    stPrep:string;
    assist:string;
    student: string;//students
    otl:string;
    hor:string;
    dvoec:string;
  end;
var
  Form1: TForm1;
  prep: TPersons;
  stud: TPersons;

implementation

{$R *.dfm}

begin
prep:=TPersons.Create;
prep.teacher:='uchitel';//prepodavately
prep.proff:='proffesor';
prep.dozent:='dozent';
prep.stPrep:='starshy prepodavatel';
prep.assist:='assistent';
prep.Free;

stud:=Tpersons.Create;
stud.student:='student';//studenty
stud.otl:='otlichnik';
stud.hor:='horoshist';
stud.dvoec:='zadoljnik';
stud.Free;

end.
Подскажите пожалуйста как далее действовать?

Последний раз редактировалось Stilet; 09.06.2010 в 13:16.
-ushёl- вне форума Ответить с цитированием
Старый 07.06.2010, 08:01   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,162
По умолчанию

Легко. У класса помимо полей есть методы и свойства. И чтобы не забивать голову на начальном этапе сделай через методы. Далее как минимум требуются конструктор и деструктор. Я предпочитаю их указывать явно и тебе советую.
ЗЫ. Поля в секции public это рабочий код, но он неправильный. Ибо зачем тогда тебе класс если можно обойтись record'ами?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 09.06.2010, 12:54   #5
-ushёl-
Форумчанин
 
Аватар для -ushёl-
 
Регистрация: 04.02.2009
Сообщений: 141
Печаль

Цитата:
Сообщение от Utkin Посмотреть сообщение
Легко. У класса помимо полей есть методы и свойства. И чтобы не забивать голову на начальном этапе сделай через методы. Далее как минимум требуются конструктор и деструктор. Я предпочитаю их указывать явно и тебе советую.
ЗЫ. Поля в секции public это рабочий код, но он неправильный. Ибо зачем тогда тебе класс если можно обойтись record'ами?
Добрый день!=)
Я создал методы для двух объектов,но методы эти из класса TForm1,компонент MainMenu.
У меня не получается запуск программы,подскажите что не так?

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Menus;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    Label2: TLabel;
    procedure N3Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure N9Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  type
    TPersons = class(TObject)
   private
    teacher: string;//prepodavately
    student: string;//students
    public

     procedure N3Click(Sender: TObject);
     procedure N4Click(Sender: TObject);
     procedure N5Click(Sender: TObject);
     procedure N6Click(Sender: TObject);
     procedure N7Click(Sender: TObject);
     procedure N8Click(Sender: TObject);
     procedure N9Click(Sender: TObject);
   end;

var
  Form1: TForm1;
  prep: TPersons;
  stud: TPersons;
implementation

{$R *.dfm}

begin
 prep:=TPersons.Create;

procedure prep.N3Click(Sender: TObject);
begin
   Label1.Caption:='10 gold prit's';
  end;
end;

procedure prep.N4Click(Sender: TObject);
begin
   Label1.Caption:='6 gold prit's';
end;

procedure prep.N5Click(Sender: TObject);
begin
 Label1.Caption:='3 gold prit's';
end;

procedure prep.N6Click(Sender: TObject);
begin
  Label1.Caption:='1 gold prit's';
end;
 prep.Free;

 stud:=TPersons.Create;
procedure stud.N7Click(Sender: TObject);
begin
   Label1.Caption:='1 silver prit';
end;

procedure stud.N8Click(Sender: TObject);
begin
   Label1.Caption:='1 bronze prit';
end;

procedure stud.N9Click(Sender: TObject);
begin
   Label1.Caption:='0 prit';
end;
stud.Free;

end.

Последний раз редактировалось Stilet; 09.06.2010 в 13:17.
-ushёl- вне форума Ответить с цитированием
Старый 09.06.2010, 13:19   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,803
По умолчанию

Что это за бред???
Это вообще работать нормально не должно.
Опиши какие методы ты хочешь прикрутить к твоему Персону.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.06.2010, 13:35   #7
-ushёl-
Форумчанин
 
Аватар для -ushёl-
 
Регистрация: 04.02.2009
Сообщений: 141
Печаль

Цитата:
Сообщение от Stilet Посмотреть сообщение
Что это за бред???
Это вообще работать нормально не должно.
Опиши какие методы ты хочешь прикрутить к твоему Персону.
Я пытаюсь сделать небольшую программу при помощи mainmenu и label,в main menu я прописал всех персонажей которые фигурируют в программе,при выборе какой либо персоны в label просто должно выводится их жалование и стиппендия. Я пытаюсь это сделать с помощью какого нибудь своего простого класса,метод я немогу придумать,я не очень отчётливо понимаю про работу(создание) классов,тем более это не консольный вывод,в Delphi7
идёт работа с компонентами я уже совсем запутался куда прописывать свой класс,что изменять,не изменить бы чего лишнего...
-ushёl- вне форума Ответить с цитированием
Старый 09.06.2010, 15:20   #8
projectsoft
Пользователь
 
Аватар для projectsoft
 
Регистрация: 09.06.2010
Сообщений: 13
По умолчанию

Если честно - то это БД.

Вот тебе статейка из проекта Delphi Word 6:

Код:
База данных методами Object Pascal 

Постановка задачи: Допустим, мне нужно в приложении Delphi сохранять некоторую информацию на диск. Мне не охото работать с текстовыми файлами, так как просмотр и обновление информации в них довольно муторное занятие. Преобладать будут операции записи и чтения, в то время как операции изменения и апдейта будут присутствовать в меньшей степени. Вся информация будет хранится в переопределённом типе данных Pascal Record. Итак, какой подход мне лучше всего использовать? 
BDE плюс Paradox или Access, ... спасибо, не надо...Не хотелось бы испытывать мороку с BDE. Использовать текстовые файлы ASCII ? Не пойдёт. Нужна хоть какая-то минимальная защита, а текстовые файлы "полностью видимы". Оказывается, ответ на данный вопрос кроется в Delphi, а именно в непечатных файлах (или файлы некоторых типов/бинарные файлы). 
Файлы 
В Delphi существует три класса файлов: typed, text, и untyped. Файлы typed - это файлы, которые содержат данные определённого типа, такие как Double, Integer или предварительно определённый тип Record. Текстовые файлы содержат читаемые символы ASCII. Файлы Untyped используются в том случае, если мы хотим работать с файлом через определённую структуру. 
Файлы Typed 
В отличие от тектовых файлов, которые содержат строки, завершающиеся комбинацией CR/LF, файлы typed содержат данные, взятые из определённой структуры данных. 

Например, следующее объявление создаёт запись с именем TMember и массив переменных типа TMember, который мы будем использовать для хранения нашей информации. 

type
  TMember = record
    name  : string[50];
    eMail : string[30];
    Posts : LongInt;
end;

var
  Members: array[1..50] of TMember;

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

var
  F: file of TMember;

Обратите внимание: 

Чтобы создать файл typed в Delphi, мы используем следующий синтакс:

var
  SomeTypedFile: file of SomeType;

Базовый тип (SomeType) для файла может быть скалярным (наподобие Double), массивом или записью. Он не может быть длинной строкой, динамическим массивом, классом, объектом или указателем. 

Чтобы начать работать с файлом из Delphi нам надо связать файл на диске с переменной файла в нашей программе. Для этого используем процедуру AssignFile. 

AssignFile(F, 'Members.dat');

Как только связь с внешним файлом установлена, переменную F необходимо 'открыть' для подготовки её к чтению или записи. Для открытия существующего файла мы используем процедуру Reset либо Rewrite для создания нового файла. После того, как программа закончит обработку файла, его необходимо закрыть при помощи процедуры CloseFile. Сразу после закрытия файла, связанный с ним внешний файл будет обновлён. Затем переменную файла можно связать с другим внешним файлом. Вообще, мы должны всегда производить обработку исключительных ситуаций, так как при работе с файлами может происходить довольно много ошибок. Например, если мы вызовем CloseFile для файла, который уже закрыт, то Delphi выдаст ошибку I/O. С другой стороны, если мы попробуем закрыть файл, до вызова AssignFile, то результаты могут быть непредсказуемыми. 

Запись 

Предположим, что у нас есть массив, заполненный именами, e-мейлами и т.д., и мы хотим сохранить эту информацию на диск. Делается это следующим образом: 

var
  F: file of TMember;
begin
  AssignFile(F,'members.dat');
  Rewrite(F);
  try
    for i:= 1 to 50 do
      write (F, Members[i]);
  finally
    CloseFile(F);
  end;
end;

Чтение 

Для получения всей информации из файла 'members.dat' используется следующий код: 

var
  Member: TMember
  F: file of TMember;
begin
  AssignFile(F,'members.dat');
  Reset(F);
  try
    while not Eof(F) do
    begin
      read (F, Member);
      { Что-нибудь делаем с данными }
    end;
  finally
    CloseFile(F);
  end;
end;

Обратите внимание: 

Eof это функция проверки конца файла (EndOfFile). Мы используем эту функцию, чтобы не выйти за пределы файла (за пределы последней, сохранённой записи).

Поиск и позиционирование 

Обычно, доступ к файлам осуществляется последовательно. При чтении из файла (используя стандартную процедуру Read) или при записи (используя стандартную процедуру Write), текущая позиция в файле перемещается на следующий по порядку компонент (следующая запись). К файлам typed так же можно обращаться через стандартную процедуру Seek, которая перемещает текущую позицию в файле на указанный компонент. Для определения текущей позиции в файле и размера файла можно использовать функции FilePos и FileSize.
projectsoft вне форума Ответить с цитированием
Старый 09.06.2010, 15:21   #9
projectsoft
Пользователь
 
Аватар для projectsoft
 
Регистрация: 09.06.2010
Сообщений: 13
По умолчанию

Код:
{устанавливаем на начало - на первую запись}
Seek(F, 0);

{устанавливаем на 5-ю запись}
Seek(F, 5);

{Переходим в конец - "после" последней записи}
Seek(F, FileSize(F));

Изменение и обновление 

Мы разобрались как записывать и считывать из файла массив Members. А что, если нам нужно найти десятую запись и изменить в ней e-mail? Давайте посмотрим на процедуру, которая делает это: 

procedure ChangeEMail(const RecN: integer; const NewEMail: string);
var
  DummyMember: TMember;
begin
  {связывание, открытие, блок обработки исключений}
  Seek(F, RecN);
  read(F, DummyMember);
  DummyMember.Email := NewEMail;
  {чтение перемещается на следующую запись, для этого необходимо
  вернуться на первоначальную запись, а затем записать}
  Seek(F, RecN);
  write(F, DummyMember);
  {закрываем файл}
end;

Всё готово 

Итак, теперь мы имеем всё, что нам нужно для реализации нашей задачи. Мы можем записать информацию на диск, считать её, и даже изменить некоторые данные (например, e-mail) в "середине" файла. Самое главное, что этот файл не в ASCII формате ! 

Общий вид модуля выглядит примерно так [здесь для наглядности данные выводятся в StringGrid'e]: 

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, Grids;

type
  TMember = record
    name  : string[50];
    eMail : string[30];
    Posts : LongInt;
end;

type
  TForm1 = class(TForm)
    SaveBtn: TButton;
    EnterDataToArrayBtn: TButton;
    OpenBtn: TButton;
    StringGrid1: TStringGrid;
    ChangeEmailBtn: TButton;
    procedure SaveBtnClick(Sender: TObject);
    procedure EnterDataToArrayBtnClick(Sender: TObject);
    procedure OpenBtnClick(Sender: TObject);
    procedure ChangeEmailBtnClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
end;

var
  Form1: TForm1;
  Members : array[1..50] of TMember;

implementation
{$R *.DFM}

procedure TForm1.SaveBtnClick(Sender: TObject);
var
  F : file of TMember;
  i: integer;
begin
  AssignFile(F,'members.dat');
  Rewrite(F);
  try
    for i:= 1 to 50 do
      write (F, Members[i]);
  finally
    CloseFile(F);
  end;
end;

procedure TForm1.EnterDataToArrayBtnClick(Sender: TObject);
begin
  Members[1].name:='___Nikolay';
  Members[1].eMail:='DelphiWorld@mail.ru';
  Members[1].Posts:=10;
  Members[2].name:='Sveta';
  Members[2].eMail:='sveta29@mail.ru';
  Members[2].Posts:=28;
  Members[3].name:='Elena';
  Members[3].eMail:='malisheva_e@rambler.ru';
  Members[3].Posts:=5;
end;

procedure TForm1.OpenBtnClick(Sender: TObject);
var
  ReadMembers: array[1..50] of TMember;
  F: file of TMember;
  i: integer;
begin
  AssignFile(F,'members.dat');
  Reset(F);
  try
    i:=0;
    while not Eof(F) do
    begin
      read (F, ReadMembers[i]);
      ////////////////////////
      StringGrid1.Cells[0,i]:=ReadMembers[i].name;
      StringGrid1.Cells[1,i]:=ReadMembers[i].eMail;
      StringGrid1.Cells[2,i]:=IntToStr(ReadMembers[i].Posts);
      ////////////////////////
      i:=i+1;
    end;
  finally
    CloseFile(F);
  end;
end;

procedure ChangeEMail (const RecN : integer; const NewEMail : string);
var
  DummyMember: TMember;
  F: file of TMember;
begin
  AssignFile(F,ExtractFilePath(Application.ExeName)+'members.dat');
  Reset(F);
  Seek(F, RecN);
  read(F, DummyMember);
  DummyMember.Email := NewEMail;
  {чтение перемещается на следующую запись, для этого необходимо
  вернуться на первоначальную запись, а затем записать}
  Seek(F, RecN);
  write(F, DummyMember);
  CloseFile(F);
end;


procedure TForm1.ChangeEmailBtnClick(Sender: TObject);
begin
  ChangeEmail(2, 'bestprogramming@mail.ru');
end;

end.
В принцепе, я думаю, Тебе поможет.
projectsoft вне форума Ответить с цитированием
Старый 10.06.2010, 01:24   #10
-ushёl-
Форумчанин
 
Аватар для -ushёl-
 
Регистрация: 04.02.2009
Сообщений: 141
По умолчанию

Мне бы конечно,что нибудь попроще=)
Спасибо за ресурс!
-ushёl- вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi7.Как создать 3 рабочих компонента CheckBox? -ushёl- Общие вопросы Delphi 2 21.03.2010 16:43
как создать класс для ввода времени kireev Помощь студентам 0 18.01.2010 17:14
Как создать собственный формат blackstersl Общие вопросы Delphi 7 22.06.2009 15:14
Собственный класс диалогового окна на чистом WinApi в Delphi Iber Win Api 19 01.12.2008 15:40
Рисование многоугольника (собственный класс) MaTBeu Общие вопросы C/C++ 1 08.12.2007 14:53