Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.12.2019, 13:47   #1
leonar
 
Регистрация: 24.12.2019
Сообщений: 7
Смущение Подскажите пожалуйста, как каждому объекту класса из списка назначить свою процедуру

как каждому объекту класса в списке назначить свою процедуру при заполнении списка объектами, со свойствами я разобрался, а вот с методами не допер пока.
Допустим вот кусок кода. как для каждого элемента списка определить свою функцию(где прописать, что для такого то элемента списка такая вот процедура), допустим есть процедуры MOV A,A, MOV A,B, ну и так далее. нужно обязательно, чтоб был список всех этих обьектов(по сути говоря команд), чтоб потом можно было цикл организовать и при совпадении введенного FCode, с значением из списка, можно было вызвать процедуру ему соответствующую, только вот где обозначить ее

Код:
TComand = class
    private
      FMnemoCode:string;
      FCode:string;
      FRowCount:integer;
    public
      constructor Create(AMnemoCode: String; ACode: string; ARowCount: integer);
 
      property MnemoCode: string read FMnemoCode write FMnemoCode;
      property Code: string read FCode write FCode;
      property RowCount: integer read FRowCount write FRowCount;
      procedure MOV(Aname,Bname:string);//на счет этого не уверен
  end;
implementation
 
constructor TComand.Create(AMnemoCode: String; ACode: string; ARowCount: integer);
begin
 
  FMnemoCode:=AMnemoCode;
  FCode:=ACode;
  FRowCount:=ARowCount;
end;

procedure ListOfComand;
var List: TObjectList;
    i: Integer;
begin
  List := TObjectList.Create;
  List.Add(TComand.Create('MOV A,A', '7F', 1));
  List.Add(TComand.Create('MOV A,B', '78', 1));
  List.Add(TComand.Create('MOV A,C', '79', 1));
leonar вне форума Ответить с цитированием
Старый 24.12.2019, 14:51   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

ВОЗМОЖНО (но совсем в этом не уверен) вам нужен(пригодится) процедурный тип переменных.
https://www.programmersforum.ru/showthread.php?t=330628
и разные виды описания таких типов
https://www.programmersforum.ru/show...hlight=regular
т.е. то же свойство (с которыми вы разобрались) вполне определенного типа(нового для вас).

В большинстве случаем разные действия в классах задаются с помощью виртуальных(virtual) функций базового класса и их переопределением(override) в наследниках.
Код:
Tcomand =class 
procedure Action; virtual; abstract;
end;
Код:
TcomandMove =class(Tcomand)
procedure Action; override;
procedure Move; virtual;
end;
Код:
TComandAA =class(TComandMove)
procedure Move; override;
end;
Код:
list.Add(TcomandAA.Create);
list.add(TcomandAB.Create);
...
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 24.12.2019, 14:52   #3
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Используйте процедурный тип
http://docwiki.embarcadero.com/RADSt..._Types_(Delphi)
Типо вот так
Код:
Type 
  TDecodeFunc=  procedure () of object;

TComand = class
    private
      FMnemoCode:string;
      FCode:string;
      FRowCount:integer;
      FOnDecode :TDecodeFunc;
      procedure Decode_MOV_R_R;
      procedure Decode_MOV_Mod_R;
    public
      constructor Create(AMnemoCode: String; ACode: string; ARowCount: integer);
      property MnemoCode: string read FMnemoCode write FMnemoCode;
      property Code: string read FCode write FCode;
      property RowCount: integer read FRowCount write FRowCount;
      property Decode:TDecodeFunc read FOnDecode write FOnDecode ;
  end;

constructor TComand.Create(AMnemoCode: String; ACode: string; ARowCount: integer);
begin
 
  FMnemoCode:=AMnemoCode;
  FCode:=ACode;
  FRowCount:=ARowCount;
  if  POS('[', AMnecode)<>0 then  
      Decode:=@Decode_MOV_Mod_R // Присваиваем адрес процедуры
     else
      Decode:=Decode_MOV_R_R; // Можно и без @ если нет скобок, то присвиеватся адрес иначе результат функции.
end;
Кстати что пишете ассемблер, дизассемблер, эмулятор, свой вариант?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 24.12.2019, 15:51   #4
leonar
 
Регистрация: 24.12.2019
Сообщений: 7
По умолчанию

эмулятор
leonar вне форума Ответить с цитированием
Старый 24.12.2019, 16:21   #5
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Лично я свой по прицепу Bochs делал один case на декодирование, один на выполнение и штук 200 констант. Застрял на отладки примитивные вещи делает, а вот на чтение с дискеты спотыкается.

Код:
//Декодирование
procedure DecodeOne_386(Buf16:PAByte);
var seg:Byte;
 a:PAByte;
 v:Integer;
begin
cLen:=0;
cLen:=GetPrefix(Buf16);

case PrefixSeg of
 0:   seg:=3; //DS
 $26: seg:=0; //ES
 $2E: seg:=1; //CS
 $36: seg:=2; //SS
 $3E: seg:=3; //DS
 $64: seg:=4; //FS
 $65: seg:=5; //GS
 end;
if OperandSize16 then v:=1 else v:=2;

a:=@buf16[cLen];
case a[0] of
//ADD
  $00..$03:
      begin
      if a[0] and 1=0 then  Comand:=cAdd_8 else Comand:=cAdd_16;
      Inc(cLen,1);
      Op1:=Mod_rm_Decode(cLen,a,seg,a[0] and 1);
      if a[0] and 1=0 then
          Op2:=GetRegOperand(a[1],0)
        else
          Op2:=GetRegOperand(a[1], v);
      if a[0] and 2<>0 then
         begin
         OpR:=Op2;
         Op2:=Op1;
         Op1:=OpR;
         end else
         begin
         OpR:=Op1;
         end;
      end;
  $04:begin
      Inc(cLen,2);
      Comand:=cAdd_8;
      Op1:=GetRegOperand(0 shl 3,0);
      Op2.top:=topImm8;
      Op2.value.b0:=a[1];
      OpR:=Op1;
      end;
  $05:begin
      if OperandSize16 then
         begin
         Inc(cLen,3);
         Comand:=cAdd_16;
         Op1:=GetRegOperand(0 shl 3,1);
         Op2.top:=topImm16;
         Op2.value.w0:=a[2] shl 8 + a[1];
         OpR:=Op1;
         end else
         begin
         Inc(cLen,5);
         Comand:=cAdd_32;
         Op1:=GetRegOperand(0 shl 3,2);
         Op2.top:=topImm32;
         Op2.value.d0:=a[4] shl 24 + a[3] shl 16 + a[2] shl 8 + a[1];
         OpR:=Op1;
         end;
      end;
  $06:
      begin
      Inc(cLen);
      Comand:=cPush_16;
      Op1:=GetRegOperand(a[0] ,5);
      end;
  $07:
      begin
      Inc(cLen);
      Comand:=cPOP_16;
      Op1:=GetRegOperand(a[0] ,5);
      OpR:=Op1;
      end;
//OR
  $08..$0B:
      begin
      if a[0] and 1=0 then  Comand:=cOr_8 else Comand:=cOr_16;
      Inc(cLen,1);
      Op1:=Mod_rm_Decode(cLen,a,seg,a[0] and 1);
      if a[0] and 1=0 then
          Op2:=GetRegOperand(a[1],0)
        else
          Op2:=GetRegOperand(a[1], v);
      if a[0] and 2<>0 then
         begin
         OpR:=Op2;
         Op2:=Op1;
         Op1:=OpR;
         end
         else OpR:=Op1;
      end;
...
end;
Код:
// Выполнение
procedure RunOne;
var t:UInt64;
begin
if Not(
     ((PrefixRep<>0) and (OperandSize16) and(recDWord(NewRegs._ECX).W0=0))
  or ((PrefixRep<>0) and not(OperandSize16) and(recDWord(NewRegs._ECX).d0=0))
  ) then
Case Comand of
 cCALL_Near_16:CALLNear16(op1.value.w0, cLen);
 cCALL_Far_16:CALLFar16(op1.value.w0,op2.value.w0, cLen);
 cJMP_Near_16:JmpNear16(op1.value.w0);
 cJmp_NearIndirect_16:JmpNearIndirect16(op1.value.w0);
 cJmp_NearIndirect_32:JmpNearIndirect32(op1.value.d0);
 cJcc_Near_16:JccNear16(op1.value.w0,op1.addr, Op2.value.b0);
 cJcc_Near_32:JccNear32(op1.value.d0,op1.addr, Op2.value.b0);
 cJMP_Far_16:JmpFar16(op1.value.w0,op2.value.w0);
 cCLC:CLC;
 cCMC:CMC;
 cSTC:STC;
 cCLD:CLD;
 cSTD:STD;
 cCLI:CLI;
 cSTI:STI;
 cMOV_8:begin
         OpR.value.b0:=Mov8(Op1.value.b0);
         OpResult(OpR);
         end;
 cMOV_16:begin
         OpR.value.w0:=Mov16(Op1.value.w0);
         OpResult(OpR);
         end;
 cMOV_32:begin
         OpR.value.d0:=Mov32(Op1.value.d0);
         OpResult(OpR);
         end;
 cXCHG_8:begin
         Xchg8(Op1.value.b0,Op2.value.b0);
         OpResult(Op1);
         OpResult(Op2);
         end;
...
end;
Код:
const
 c_VirtualNop=$FFFF;
 cJMP_Near_16=0;
 cJMP_Far_16=1;
 cCLC=2;
 cCMC=3;
 cSTC=4;
 cCLD=5;
 cSTD=6;
 cCLI=7;
 cSTI=8;
 cMOV_8=9;
 cMOV_16=10;
 cMOV_32=11;
 cXCHG_8=12;
 cXCHG_16=13;
 cXCHG_32=14;
 cUD_8=15;
 cUD_16=16;
 cUD_32=17;
 ...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 25.12.2019, 10:08   #6
leonar
 
Регистрация: 24.12.2019
Сообщений: 7
По умолчанию

а что вот это означает, т.е. вот: POS('[', AMnecode)

if POS('[', AMnecode)<>0 then
Decode:=@Decode_MOV_Mod_R // Присваиваем адрес процедуры
else
Decode:=Decode_MOV_R_R; // Можно и без @ если нет скобок, то присвиеватся адрес иначе результат функции.
end;
leonar вне форума Ответить с цитированием
Старый 25.12.2019, 10:22   #7
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от leonar Посмотреть сообщение
а что вот это означает, т.е. вот: POS('[', AMnecode)
Это Я просто для примера. Очевидно что 'MOV A,B' и 'MOV B,A' это одна функция, а 'MOV [A],B' и 'MOV A,[B]' другая.
Мнемоника [] означает чтение переменной с адреса.

Но Вы можете придумать и написать свои условия по которым присвоить разные функции.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 25.12.2019, 10:23   #8
leonar
 
Регистрация: 24.12.2019
Сообщений: 7
По умолчанию

Pavia, А вот параметры для этих функций значит тут же в свойствах класса прописывать, я имею ввиду все регистры, признаки и т.д.
leonar вне форума Ответить с цитированием
Старый 25.12.2019, 10:32   #9
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от leonar Посмотреть сообщение
А вот параметры для этих функций значит тут же в свойствах класса прописывать, я имею ввиду все регистры, признаки и т.д.
Не обязательно, это больше вопрос вкуса. Если параметры однородны, тобишь одинаковые для всех мнемоник то можно сделать так
Код:
  TDecodeFunc=  procedure (var operend1, operend2:TOperend) of object;
Код:
  FOnDecode :TDecodeFunc;
      procedure Decode_MOV_R_R(var operend1, operend2:TOperend);
      procedure Decode_MOV_Mod_R(var operend1, operend2:TOperend);
А вот если они разнородные, то проще оформить параметры полями класса.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 26.12.2019, 09:29   #10
leonar
 
Регистрация: 24.12.2019
Сообщений: 7
По умолчанию

Как вызвать в другом юните уже созданный экземпляр, и получить доступ к его полям.(Юниты связаны) Вот код Юнита, где создан класс. При таких действиях вылезает Error, но он и должен вылезать,т.к. я делаю неверно.Подскажите, как правильно.
Код:
procedure TRegister.CreateReg;
begin
regA:=Tregister.create;
end;

procedure TRegister.AddReg;
begin
regA.Rname:='A';
regA.value:='00';
regA.AIndex:=0;
end;

procedure TRegister.DelReg;
begin
regA.Free;
end;
Вот юнит с формой
Код:
procedure TEm.BitBtn1Click(Sender: TObject);
begin
TRegister.Addreg;
label1.Caption:=regA.RName;
end;

procedure TEm.FormCreate(Sender: TObject);
begin
Tregister.CreateReg;
end;

procedure TEm.FormDestroy(Sender: TObject);
begin
Tregister.delReg;
end.
Вот создание класса;
Код:
TRegister = class(TProcessor)
  protected
  fvalue:string;
  fRName:string;
  fIndex:integer;
  //procedure SetRegister( Value:string);
  //function GetRegister:string;
  public
  property value:string read fvalue write fvalue;
  property RName:string read fRName write fRName;
  property AIndex:integer read fIndex write fIndex;
  procedure CreateReg;
  procedure AddReg();
  procedure DelReg();
  end;
leonar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить несколько объектов в качестве аргументов и получить доступ к каждому объекту Illusiony PHP 3 18.04.2019 20:03
Назначить выбранное из списка переменнной Mamont_ololoev HTML и CSS 2 27.01.2013 21:08
Обращение к из одной функции класса к другой того же класса,не указывая к какому объекту она относиться zipwind C++ Builder 1 09.04.2011 17:18
Ошибка при присвоении объекту производного класса объекта базового класса с исп. явного приведения типов Lanx Помощь студентам 0 06.04.2011 20:24
Как написать свою процедуру? theYozh Помощь студентам 10 08.03.2009 11:18