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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.07.2015, 16:34   #11
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
r:=TPen.Create;
r.Assign(canvas.Pen);
Цитата:
If the Source parameter identifies another TPen object, Assign copies the Color, Width, Style, and Mode properties of the source
Код:
canvas.Pen.asign(r);
r.Free;
Код:
TCanvasCopies =class
end;

r:=TCanvasCopyes;
r.Copy(Canvas);

r.Retry(Canvas);
r.Free;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 31.07.2015 в 16:40.
evg_m на форуме Ответить с цитированием
Старый 31.07.2015, 16:43   #12
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

я думал об этом. овчина выделки не стоит - для хранения 2-3 32-битных целых создавать/убивать целый большой объект - некомильфо. За основу пришлось пока взять глобальный объект TStack<Integer>. Если по скорости не устроит, буду подумать дальше. Если интересно, могу засветить исходник класса, мож предложишь, как его подпилить напильником...
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 31.07.2015, 17:56   #13
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Не думаю, что реализовать это через стек самая лучшая идея, т.к. мы точно не можем знать, как в итоге будет выглядеть наш код на asm’е, и как использоваться стек. Поэтому нужно будет учитывать множество моментов, чтоб не было проблем. Мы же не можем быть уверены, что в промежутке между нашими push и pop не будет изменен указатель на стек. Скорее всего, правильнее будет использовать класс стека.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 31.07.2015, 18:35   #14
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
мы точно не можем знать, как в итоге будет выглядеть наш код на asm’е, и как использоваться стек
Как так не будем? Использование дизассемблера в окне CPU запретили на саммите большой 8-ки?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 31.07.2015, 18:45   #15
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Один раз скомпилируем - код один, второй раз - код другой, и могут быть уже проблемы. А если даже все будет корректно работать, то после обновления компилятора все может измениться.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 31.07.2015, 18:56   #16
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Да пох.
Мне самому интересно, на что тут может повлиять обновление компайлера?
На данный момент говнокод выглядит вот так. Ещё не отлаживал.
Код:
  TCanvasParamsStack = class(TStack<Integer>)
  public
    procedure PushPen(P: TPen);
    procedure PopPen(P: TPen);
    procedure PushBrush(B: TBrush);
    procedure PopBrush(B: TBrush);
    procedure PushPenBrush(P: TPen; B: TBrush);
    procedure PopPenBrush(P: TPen; B: TBrush);
  end;

implementation

{ TCanvasParamsStack }

procedure TCanvasParamsStack.PushPen(P: TPen);
begin
  // свойства - по алфавиту, шоб не запутаться
  Push(P.Color);
  Push(Integer(P.Mode));
  Push(Integer(P.Style));
  Push(Integer(P.Width));
end;


procedure TCanvasParamsStack.PopPen(P: TPen);
begin
  // по алфавиту в обратном порядке
  P.Width:= Pop();
  P.Style:= TPenStyle(Pop());
  P.Mode:=  TPenMode(Pop());
  P.Color:= TColor(Pop());
end;

procedure TCanvasParamsStack.PushBrush(B: TBrush);
begin
  // по алфавиту
  Push(B.Color);
  Push(Integer(B.Style));
end;

procedure TCanvasParamsStack.PopBrush(B: TBrush);
begin
  // по алфавиту в обраном порядке
  B.Color:= Pop();
  B.Style:= TBrushStyle(Pop());
end;

procedure TCanvasParamsStack.PushPenBrush(P: TPen; B: TBrush);
begin
  PushPen(P);
  PushBrush(B);
end;

procedure TCanvasParamsStack.PopPenBrush(P: TPen; B: TBrush);
begin
  PopBrush(B);
  PopPen(P);
end;
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 31.07.2015, 19:10   #17
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Мне самому интересно, на что тут может повлиять обновление компайлера?
Я про asm вставки, из-за них могут быть проблемы.

Считаю, что код, который Вы написали и есть более правильным решением.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 31.07.2015, 20:11   #18
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Я хотел сделать сохранение/восстановление переменных разных! типов без использования глобальных буферов, именно с помощью стека.
В предложенном виде не получится сделать. Ты ведь по сути хочешь из ассемблера вручную выделить произвольный стековый кадр. Всё прекрасно, но стековый кадр существует только в контексте процедуры, а при выходе из нее уничтожается, -- указатель стека тупо возвращается на место операцией RET.

Поэтому, если действительно хочется так сделать, придется передавать не только массив значений, но и указатель на код (процедуру), в контексте которой будет существовать созданный кадр. Получится классическое спагетти, то есть говнокод.

Ручную работу со стековыми кадрами можно посмотреть в коде KOL или у меня в CoreUtils (FormatBuf) и CoreExceptions (ExceptMsgBox).
Vapaamies вне форума Ответить с цитированием
Старый 31.07.2015, 20:52   #19
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Всё прекрасно, но стековый кадр существует только в контексте процедуры, а при выходе из нее уничтожается, -- указатель стека тупо возвращается на место операцией RET.
Правильно. Мне это и надо, см. пост #10.
Цитата:
Ручную работу со стековыми кадрами можно посмотреть в коде KOL или у меня в CoreUtils (FormatBuf) и CoreExceptions (ExceptMsgBox).
В данном случае - нет смысла, спасибо.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 31.07.2015, 20:54   #20
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
более правильным решением.
Оно, мож, и правильное, но жирное и медленное.
Ланда, проехали.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Плагины OllyDump для OllyDbg- какой из плагинов круче? Dimka-novitsek Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 29.08.2014 23:46
давайте вместе игру зделаем круче варкрафта Coel Свободное общение 24 27.02.2010 16:05
надо чтобы комп автоматически перезагружался, а ещё круче чтоб вырубался steck Общие вопросы Delphi 3 01.04.2007 15:52