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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шахматы, Разработка программы 
:(
    Опции темы
VanHelsing
Дата 16.10.2009, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



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

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



  Все привет! Получил задание в институте по предмету "Технологии программирования" написание программы "ШАХМАТЫ". Программа предназначена для игры двух людей (т.е. изначально никакого ИИ не предусмотрено, хотя возможно его реализация). 
Почему решил создать данную тему, потому что хотелось чтобы указали на мои ошибки, возможно предложили бы наиболее оптимальные методы реализации. Надеюсь никто сильно ругать не будет. smile 
  Итак начну!
  Преподаватель сказать, что прежде чем приступать к описанию классов фигур необходимо создать шахматную доску без фигур естественно. 
  Возможно несколько методов реализации: 
- рисование на форме(Canvas) - самый простой вариант я его пока и выбрал
- с использование компонентов TShape
- с использование компонентов TPanel
  Вот реализация рисования доски на форме:
Код

procedure TForm1.FormPaint(Sender: TObject);
var
  i, j: Byte;
  x1, y1, step: Word;
  strBuk: string;
begin
  strBuk := 'hgfedcba';
  Canvas.Pen.Color := clBlack;
  Canvas.Pen.Width := 2;
  x1 := 30;
  y1 := 20;
  step := 60;
  for I := 1 to 8 do
    begin
      for j := 1 to 8 do
        begin
          if ((i + j) mod 2)<>0  then Canvas.Brush.Color := clBlack
          else Canvas.Brush.Color := clWhite;
          Canvas.Rectangle(x1, y1, x1 + step, y1 + step);
          x1 := x1 + step;
        end;
      y1 := y1 + step;
      x1 := 30;
    end;
  { рисование букв }
  y1 := 20+step;;
  for I := 1 to 8 do
    begin
      Canvas.Brush.Color := clBtnFace;
      Canvas.Font.Size:=12;
      Canvas.TextOut((x1 div 2), (y1 div 2), strBuk[i]);
      y1 := y1 + step*2;
    end;
  { рисование цифр }
  y1 := 20 + 8*60;
  x1 := 30 + 60;
  for I := 1 to 8 do
    begin
      Canvas.Brush.Color := clBtnFace;
      Canvas.Font.Size := 12;
      Canvas.TextOut((x1 div 2), y1, IntToStr(i));
      x1 := x1 + step*2;
    end;
end;

P.S. в следующий раз приведу описание классов


--------------------
PM MAIL   Вверх
THandle
Дата 16.10.2009, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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



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

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



Цитата(VanHelsing @  16.10.2009,  12:21 Найти цитируемый пост)
- с использование компонентов TShape
- с использование компонентов TPanel


ИМХО, эти варианты намного хуже выбранного тобой. Создавать столько контролов на форме, размещать их... Я думаю не стоит эти варианты переделывать.

Замечание по коду основное:

VanHelsing, вообще представь себе, как часто окно перерисовывается(выполняется событие OnPain). Зачем тебе это? Ты рисуй один раз доску, и перерисовывай это только при изменеении положения фигур.

Как ты собираешься реализовывать доску с фигурами(не графически)? В виде каких структур?
PM   Вверх
Данкинг
Дата 16.10.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



Цитата(THandle @  16.10.2009,  13:30 Найти цитируемый пост)
Создавать столько контролов на форме, размещать их... 

Так можно динамически создать и разместить. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
VanHelsing
Дата 16.10.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



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

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



Насчет TShape и TPanel - преподаватель сказал рассмотреть все варианты, они отличаются в плане реализации. Фигуры будут в виде картинок (TImage), которые будут размещены в файле ресурсов.
Цитата

Так можно динамически создать и разместить. 

Да вся программа должна быть реализована динамически - это одно из главных условий. Просто забыл об этом написать.
P.S. вечером постараюсь выложить доску с фигурами. Спасибо что откликнулись! smile 

Это сообщение отредактировал(а) VanHelsing - 16.10.2009, 13:23


--------------------
PM MAIL   Вверх
TheVoid
Дата 16.10.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Присоединённый файл ( Кол-во скачиваний: 68 )
Присоединённый файл  MiniChess.zip 22,77 Kb
PM   Вверх
VanHelsing
Дата 16.10.2009, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



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

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



Теперь хотелось бы рассмотреть классы фигур. Будет один базовый класс фигур, а его потом будут содержать только один переопределяемый метод. Но обо всем по порядку.
Что нам необходимо в классе фигуры:  во-первых конечно это хранение цвета фигуры и ее позиции(хранение позиции будет в качестве свойства - у позиции фигуры два параметра), конструктор, процедура хода которая будет виртуальной и переопределяться у наследников класса т.к. каждая фигура ходит по-разному.
Наверное что-то забыл, но пока я считаю что этого достаточно.
Базовый класс:
Код

TFigura=class(TImage) // базовый класс фигуры
  private
    Color1: TColor;
    ipos, jpos: Integer;
    constructor Create(i1, j1:Integer);
    function Hod(x, y: Integer): Boolean; virtual; abstract;
    procedure PosistionI(PosI: Integer);
    procedure PositionJ(PosJ: Integer);    
    property I: Integer read ipos write PosistionI;
    property J: Integer read jpos write PositionJ;
 end;

Наследники:
Код

TPeshka=class(TFigura)
  private
    function Hod(x, y: Integer): Boolean; override;
  end;

  TTura=class(TFigura)
  private
    function Jump(x, y: Integer): Boolean;
    function Hod(x, y: Integer): Boolean; override;
  end;

  THorse=class(TFigura)
  private
    function Hod(x, y: Integer): Boolean; override;
  end;

  TSlon=class(TFigura)
  private
    function Hod(x, y: Integer): Boolean; override;
  end;

  TFerz=class(TFigura)
  private
    function Hod(x, y: Integer): Boolean; override;
  end;

  TKorol=class(TFigura)
  private
    function Hod(x, y: Integer): Boolean; override;
  end;

Выбрал в качестве родительского класса TImage, потому что фигура на доске будет представлять картинкой.
P.S. если есть другие предложения с радостью рассмотрю. smile  

Это сообщение отредактировал(а) VanHelsing - 16.10.2009, 18:50


--------------------
PM MAIL   Вверх
THandle
Дата 17.10.2009, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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



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

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



VanHelsing, а теперь подумай как ты с этими картинками, TColor'ами и всем таким прочим реализовывать саму логику.
Поле у тебя, к примеру, будет представленно каким нибудь массивом. Тебе нужны максимально простые структуры данных, именно для легкого управления, перемещения их по доске. А отрисовку графики следует произвоть отдельно от логики и в последнюю очередь. ИМХО.

Цитата(Данкинг @  16.10.2009,  14:14 Найти цитируемый пост)
Так можно динамически создать и разместить.


От этого лишней памяти они меньше занимать не станут smile
PM   Вверх
VanHelsing
Дата 17.10.2009, 06:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



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

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



THandle для начала программу надо реализовать как требует преподаватель, а вот можно представлять какие угодно варианты.
В данной реализации нет никакой сложно логики: размещаем картинки фигур, далее отслеживаем клик(проверяем не выходит ли он за границы доски) и делаем соответствующий расчет и получаем позицию на доске, допустим [ 1, 1 ].
А вот с другой с другим вариантом логики у меня пока проблемы. Можно рассмотреть шахматную доску в качестве матрицы 8*8, а каждая фигура имеет свой индивидуальный номер(пустая - 0, пешка белого цвета - 1 и т.д.). Вот это пока единственный вариант.
P.S. хотелось бы услышать другие предложения.


--------------------
PM MAIL   Вверх
THandle
Дата 17.10.2009, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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



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

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



Цитата(VanHelsing @  17.10.2009,  07:50 Найти цитируемый пост)
А вот с другой с другим вариантом логики у меня пока проблемы. Можно рассмотреть шахматную доску в качестве матрицы 8*8, а каждая фигура имеет свой индивидуальный номер(пустая - 0, пешка белого цвета - 1 и т.д.). Вот это пока единственный вариант.


Вот что то подобное будет как мне кажется лучше, чем вариант с двиганьем картинок. Хотя если преподаватель сказал так делать - никуда не денешься... Они такие... :(

Я бы взял такую вот матрицу, наполнил её фигурами, нарисовал бы изначальную доску, и при каждом ходе изменял сначал данные матрицы, а потом перерисовывал бы ту часть доски где произошли какие-то изменения.
Единственное чем сложнее такой вариант, чем варианты типа, когда используешь панельки - тебе будет немного сложнее отследить клик.

Пок оду выше. Это как так получилось что у тебя все находится в private секции? Поля вообще лучше именовать с F, плюс свойства I, J -это не красиво. Давай нормальные названия, такие должны быть у переменных счетчиков, ИМХО. Плюс классы фигур конечно лучше проименовать по-английски, а то как-то дико читать smile 
PM   Вверх
VanHelsing
Дата 17.10.2009, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



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

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



Цитата

Пок оду выше. Это как так получилось что у тебя все находится в private секции? Поля вообще лучше именовать с F, плюс свойства I, J -это не красиво. Давай нормальные названия, такие должны быть у переменных счетчиков, ИМХО. Плюс классы фигур конечно лучше проименовать по-английски, а то как-то дико читать

Насчет private - преподаватель сказал, что шаг в сторону любой другой секции приравнивается к незачету. Поля и свойства переименую(X и Y думаю будут красивее смотреться). 
Насчет другой реализации. Хорошо представить доску в виде матрице я давно хотел, но пока не вижу альтернативы картинкам. Хотя возможно она и есть. smile  
P.S. конечно можно фигуры тоже на "канве" рисовать, но мне кажется что это сложнее.

Это сообщение отредактировал(а) VanHelsing - 17.10.2009, 09:05


--------------------
PM MAIL   Вверх
Beltar
Дата 17.10.2009, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я бы доску, как компонент оформил, как я полагаю это д/б даже не контрол, а просто невизуальный компонент с битмепом доски внутри, по которому можно рисовать фигуры, а потом бросать это на PaintBox и в нее же можно запихнуть сам массив полей и ссылки на экземпляры фигур. Кстати, у PaintBox'а есть свойство DoubleBuffered (как я понимаю, оно позволяет строить изображение в памяти и потом выводить разом, так что контрол при перерисовке не мерцает) или это прирогатива TWinControl'а?
При отрисовке координат определяй сначала длину и ширину текста, иначе их положение непредсказуемо даже на компьютерах с одинаковой схемой оформления.

Цитата
а потом перерисовывал бы ту часть доски где произошли какие-то изменения.


На мой взгляд бессмысленно, т. к.
1) фигура может и тоскаться игроком, хотя для простоты можно и поля выделять.
2) Доска все равно будет перерисовываться полностью при переключении на программу. Т. е. полня отрисовка в идеале все равно д/б быстрее 50 мс.

Цитата

Насчет private - преподаватель сказал, что шаг в сторону любой другой секции приравнивается к незачету.


Честно говоря, препод, похоже, маленько того, если по хорошему, то возможен такой вариант (извини, но слова роде tura мне слух режут, так что использую общепринятые англ. названия):

Код

TPiece=class(TObject);
  private
  FSide:Boolean;//Или инт.
  FPos:TPoint;{а можно вообще свою структуру написать с перекрытым методом равенства, и ф-иями определения нахождения полей на одной диагонали, горизонтали и вертикали (для ферзя полезно) если у тебя Delphi выше 7 :) }
  procedure SetPos(Value:TPoint);
  procedure Draw;virtual;
  public Pos:TPoint read FPos write SetPos;
  Side:Boolean; read FSide;
  constructor Create(Side:Boolean);
end;

TKing=class(TPiece)
public
  Moved:Boolean;{Для рокировки! Аналогично ладья. Внимание вопрос, на какой фиг размещать это поле в приват, когда сеттера все равно нет, а вот вполне возможно, что ты захочешь сделать режим расстановки фигур и тебе согласно правил надо будет указать возможны ли рокировки т. е. т. е. оно должно быть доступно внешней программе}
end;


Правда, возможно, стоит забить на такую классовую иерархию и обойтись числовым индексом фигуры, тем более что ЕМНИП с оператором is, который понадобиться для анализа, конкретных фигур есть засада с определением типа конкретного экземпляра. Поправьте, если ошибаюсь.

Есть в шахматах еще один сложный для реализации пунктик, называется взятие на проходе, для него надо анализировать последний ход, только препод про него может и не знать.

PS я бы не отказался от хорошей реализации шахмат для игры по LAN'у в нете мне ничего стоящего найти не удалось.

Это сообщение отредактировал(а) Beltar - 17.10.2009, 11:04


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


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



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

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



Beltar спасибо за идею.
Сейчас пока обдумываю логику программы, если представить доску в виде матрицы. Надо ведь связать фигуры на доске с матрицей. При клике на фигуре надо рассчитывать ее координаты.
Да а в программе, которую требует преподаватель надо использовать DragandDrop.



--------------------
PM MAIL   Вверх
Beltar
Дата 18.10.2009, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Так описываешь доску как: TBoard=array[1..8,1..8] of TPiece, или как ты хотел через числа, тогда Integer (я бы юзал 0 для пустой клетки и отр. значения для черных фигур, так легче и нач. позицию заполнить и что-то подсчитывать и даже определять возможность хода, если поле=0 или отличается по знаку, и даже превращение пешки, если ее код плюс\минус 1 реализуется простым умножением на код белой фигуры);

Вообще можно сделать так:

Код

TChessBoard=class(TCustomControl);
  private
  FFields:TBoard;
  protected
  //А здесь переопределяем процедуры диспетчеризации событий мыши, не забываем при этом вызывать inherited
  procedure DoMouseDown;override{возможно, просто MouseDown, не помню точно, здесь определяем на каком поле кликнули, границы доски знаешь, длину, ширину знаешь, в общем легко пересчитаешь, как-то помечаем фигуру схваченной игроком, например код умножить на 100, запоминаем координаты клика, запоминаем прямоугольник фигуры (по идее его бы растягивать на все поле)}
  procedure MouseMove;override;{тут если у нас в курсоре фигура, высчитываем смещение мышки относительно запомненного в MouseDown, прибавляем его к координатам прямоугольника фигуры и рисуем ее}
  procedure DoMouseUp;override;{бросаем фигуру на новое поле, если это, конечно, возможно}
  {наверняка нужно обработать Resize, особенно, если фигуры масштабируются, или рисуешь сначала на битмепе, а потом его просто копирушь на Canvas контрола}
  public
  property Fields[Index:Integer,Index:Integer{не создавал двумерные индексные свойства так что может вру с синтаксисом}]:TPiece/Integer read GetFields write SetFields;




Это сообщение отредактировал(а) Beltar - 18.10.2009, 13:02


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


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



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

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



Так накидывал код программы(пока некрасивый и неокончательный) и столкнулся с такой проблемой: т.к. я рисую на форме, а в качестве фигур использую TImage, то для перемещения фигур использую 
Код

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);

Ну бывает что одна фигура рубит другую, т.е. одну фигуру надо уничтожить, а вторую поставить на ее место. Я не знаю в каком обработчике и как ее реализовать.
P.S. думаю.......


--------------------
PM MAIL   Вверх
VanHelsing
Дата 20.10.2009, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



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

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



Сделал создание фигур и их расстановка на доске:
Код

unit UChess;

interface

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

type
  TForm1 = class(TForm)
    procedure FormPaint(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TFigure=class(TImage) // базовый класс фигуры
  private
    FColor: TColor;
    FxPos, FyPos: Integer;
    constructor Create(i, j:Integer);
    function Hod(x, y: Integer): Boolean; virtual; abstract;
    procedure PosistionX(PosX: Integer);
    procedure PositionY(PosY: Integer);    
    property X: Integer read FxPos write PosistionX;
    property Y: Integer read FyPos write PositionY;
  end;

  TPawn=class(TFigure)
    function Hod(x, y: Integer): Boolean; override;
  end;

  TRook=class(TFigure)
    function Hod(x, y: Integer): Boolean; override;
  end;

  THorse=class(TFigure)
    function Hod(x, y: Integer): Boolean; override;
  end;

  TElephant=class(TFigure)
    function Hod(x, y: Integer): Boolean; override;
  end;

  TQueen=class(TFigure)
    function Hod(x, y: Integer): Boolean; override;
  end;

  TKing=class(TFigure)
    function Hod(x, y: Integer): Boolean; override;
  end;
 

var
  Form1: TForm1;
  Figure: array[1..32] of TFigure;

implementation

{$R *.dfm}
{$R MyRes.res}

procedure TForm1.FormCreate(Sender: TObject);
var
  i:Byte;
begin
 for I := 1 to 8 do
    begin
      Figure[i] := TPawn.Create(2, i);
      Figure[i+8] := TPawn.Create(7, i);
    end;
  Figure[17] := TRook.Create(1, 1);
  Figure[18] := TRook.Create(8, 1);
  Figure[19] := TRook.Create(8, 8);
  Figure[20] := TRook.Create(1, 8);
  Figure[21] := THorse.Create(1, 2);
  Figure[22] := THorse.Create(1, 7);
  Figure[23] := THorse.Create(8, 2);
  Figure[24] := THorse.Create(8, 7);
  Figure[25] := TElephant.Create(1, 3);
  Figure[26] := TElephant.Create(1, 6);
  Figure[27] := TElephant.Create(8, 3);
  Figure[28] := TElephant.Create(8, 6);
  Figure[29] := TQueen.Create(1, 4);
  Figure[30] := TQueen.Create(8, 4);
  Figure[31] := TKing.Create(1, 5);
  Figure[32] := TKing.Create(8, 5);
end;


procedure TForm1.FormPaint(Sender: TObject);
var
  i, j: Byte;
  x1, y1, step: Word;
  strBuk: string;
begin
  strBuk := 'hgfedcba';
  Canvas.Pen.Color := clBlack;
  Canvas.Pen.Width := 2;
  x1 := 30;
  y1 := 30;
  step := 60;
  for I := 1 to 8 do
    begin
      for j := 1 to 8 do
        begin
          if ((i + j) mod 2)<>0  then Canvas.Brush.Color := clBlack
          else Canvas.Brush.Color := clWhite;
          Canvas.Rectangle(x1, y1, x1 + step, y1 + step);
          x1 := x1 + step;
        end;
      y1 := y1 + step;
      x1 := 30;
    end;
  { рисование букв }
  y1 := 30 + step;;
  for I := 1 to 8 do
    begin
      Canvas.Brush.Color := clBtnFace;
      Canvas.Font.Size:=12;
      Canvas.TextOut((x1 div 2), (y1 div 2), strBuk[i]);
      y1 := y1 + step*2;
    end;
  { рисование цифр }
  y1 := 30 + 8*60;
  x1 := 30 + 60;
  for I := 1 to 8 do
    begin
      Canvas.Brush.Color := clBtnFace;
      Canvas.Font.Size := 12;
      Canvas.TextOut((x1 div 2), y1, IntToStr(i));
      x1 := x1 + step*2;
    end;
end;

{ TFigure }

constructor TFigure.Create(i, j: Integer);
var
  NameClass: string;
begin
  NameClass := ClassName;
  inherited Create(Form1);
  Parent := Form1;
  DragMode := dmAutomatic;
  if (i<=2) then  // Определение цвета фигуры
   begin
     Picture.Bitmap.LoadFromResourceName(HInstance, 'WH_' + NameClass);
     FColor := clWhite;  // фигура черная
   end  
  else
    begin
      Picture.Bitmap.LoadFromResourceName(HInstance, 'BL_' + NameClass);
      FColor := clBlack;  // фигура белая
    end;
  X := i;
  Y := j;
  Transparent := true;  
end;

procedure TFigure.PosistionX(PosX: Integer);
begin
   FxPos := PosX;
  if(PosX>=1) or (PosX<=8) then Top := 60*(8-PosX)+30
  else
    ShowMessage(' Нет такой позиции '); 
end;

procedure TFigure.PositionY(PosY: Integer);
begin
  FyPos := PosY;
  if(PosY>=1) or (PosY<=8) then Left := 60*(PosY-1)+30
  else
    ShowMessage(' Нет такой позиции ');
end;

P.S. проблема которая описана выше пока не решена.

Это сообщение отредактировал(а) VanHelsing - 20.10.2009, 17:49


--------------------
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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