Перейти к содержанию
Fire Monkey от А до Я

PFC

Пользователи
  • Постов

    7
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные PFC

  1. Если я правильно понял смысл вопроса, то вместо bkSolid нужно писать Solid. bkSolid - это устаревший (deprecated) вариант. Он еще работает для совместимости, но его использование в новых версиях студии не рекомендуется.

     

    Примерно так. Меня смутил TBrushKind.Solid - что для С++ явно не верный вариант т.к. объекта TBrushKind нет. Просто в данном сообщении компилятора имеется ввиду пространство имен TBrushKind, а не объект.

     

    Вариант не дающий предупреждения:

    Canvas->Stroke->Kind = TBrushKind::Solid;

  2. Во время компиляции С++ проекта получаю вот такие назойливые Warning'и:

    bkSolid is deprecated: Use TBrushKind.Solid

     

    В коде тип линии задается так:

    Canvas->Stroke->Kind = TBrushKind::bkSolid;

     

    Очевидно, что код:

    Canvas->Stroke->Kind = TBrushKind.Solid;

    Приведет к ошибке

    'TBrushKind' does not refer to a value

     

    В целом оно и так работает, хочется понять как надо делать правильно.

  3. Подскажите куда копать. Пытаюсь нарисовать поле из прямоугольников, часть из которых символизирует фигуру и рисуется закрашенными. Под Windows все чудесно, под Android вижу только закрашенные. Думал не попадаю в пикселы, установил толщину в 3 и AlignToPixel - не помогло.

     

    Код:

    void __fastcall TForm1::imgFieldPaint(TObject *Sender, TCanvas *Canvas, const TRectF &ARect)
    {
    	int min = Min(ARect.Width() / FieldRows, ARect.Height() / FieldCols);
    
    	for (int y = 0; y < FieldRows; y++)
    	{
    		for (int x = 0; x < FieldCols; x++)
    		{
    			// ячейка для отрисовки
    			TRectF R(Canvas->AlignToPixel(TPointF(x*min, y*min)), min, min);
    			// если часть фигуры - рисуем квардрат
    			if (iField[y][x])
    			{
    				Canvas->Fill->Color = CellColors[iField[y][x]];
    				Canvas->FillRect(R, 0, 0, AllCorners, 1.0);
    			}
    			// рисуем ячейку
    			Canvas->Stroke->Thickness = 3;
    			Canvas->Stroke->Color = TAlphaColor(claRed);
    			Canvas->DrawRect(R, 0, 0, AllCorners, 1.0);
    		}
    	}
    }
    

    Рузультат:

    b20f7092083ca13ae9809d9b46c21858.png

  4. Есть класс:

    class TMyObjectInt : public TObject
    {
    private:
         int Value;
    public:
         __fastcall TMyObjectInt (int _Value);
         __fastcall ~TMyObjectInt();
    };
    

    Есть ComboBox:

    for (int i = 1; i <= 10; i++)
    	cbxItems->Items->AddObject(IntToStr(i), new TMyObjectInt(i));
    

    Почему при вызове ->Clear() не вызываются деструкторы для TObject'ов? Казалось бы базовый TObject замечательно для этого подходит, даже деструктор у него виртуальным объявлен.

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

     

    Кстати, так же ведут себя и многие другие контролы, да и в VCL было так же.

  5. Спсибо за ответ. Через OnPaint действительно работает. Однако у меня пиявилось еще несколько вопросов:

     

    1. В интернете много примеров, когда рисование все же идет по нажатию кнопки. Вот например: http://docwiki.embarcadero.com/CodeExamples/XE6/en/FMXTCanvasDrawFunctions_(Delphi) (этот примечателен еще и тем, что он от самой Embarcadero) Я вижу что он для XE6, в XE7 что-то изменилось (я уже заметил, что BitmapChanged стал приватным) ? Возможно ли как-то обойти ограничение на рисование только в OnPaint?
    2. У TImage и PaintBox действительно есть метод Repaint, а вот у  формы такого метода нет. Что лучше использовать если я таки хочу рисовать на форме?
  6. Исходно пытался нарисовать битмап на канве формы. Затем пытался нарисовать хоть что-нибудь. Все время получаю пустой экран. При этом аналогично ничего не получается и с TImage и с PaintBox. Проект на С++, Embarcadero XE7. Что я делаю не так?

    SolverMXE7.zip

×
×
  • Создать...