Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Embarcadero RAD Studio XE2 (Pulsar)

Автор: Frodo_Torbins
Дата сообщения: 22.10.2011 13:45
tank0
FireMonkey - не игровой движок, а для бизнес приложений фреймрейт не критичен. В любом случае сейчас FireMonkey - это скорее tehnology preview, а не готовый продукт.
Автор: tank0
Дата сообщения: 23.10.2011 20:13
Frodo_Torbins
Business application? I don't think the same UI components as Windows/Macs are suitable for the mobile application. The failure of Windows Mobile is a good example. Anyway, step forward is better than just stop by.

Ru(PROMT):

Бизнес-приложение? Я не думаю те же самые компоненты UI, как Windows/Macs являются подходящими для мобильного приложения. Отказ операционной системы Windows Mobile - хороший пример. Так или иначе шаг вперед лучше чем, только заходят.
Автор: LG Team
Дата сообщения: 23.10.2011 23:38
кому всё ещё интересно, как изменить шрифт у StringGrid'a..
достал этим вопросом Конопку (:, предлагаю его решение:

[more]
How do you change the font size of a TStringGrid in FireMonkey?

This is a very good question. Sounds simple enough, but it turns out that it is anything but simple. However, before diving into what is needed to accomplish the above, we first need to setup our TStringGrid which is a bit different in FMX. We'll start by creating a new FireMonkey HD application and drop a TStringGrid on the form. Next, we need to add one or more columns to the grid. To do this, right-click on the TStringGrid and select "Add Item" from the context menu. This will create a new TStringColumn to the grid. With one or more TStringColumn instances created, we can use the Cells property at runtime to populate the grid. For example,

procedure TForm21.FormCreate(Sender: TObject);
begin
StringGrid1.Cells[ 0, 0 ] := 'Cell00';
StringGrid1.Cells[ 1, 0 ] := 'Cell10';

StringGrid1.Cells[ 0, 1 ] := 'Cell01';
StringGrid1.Cells[ 1, 1 ] := 'Cell11';
end;

Getting back to the original question of modifying the font size of the grid cells. I first tried to modify the style using the Style Designer, but there is no style associated with the cells at the grid level. I then tried the TStringColumn level, and there is no style at all for that. When I looked at the source code I saw that the TStringColumn manages a list of CellControls, which for the TStringGrid is a list of TTextCell instances. And TTextCell is a direct descendant of TEdit.

Well, changing the text size is pretty straight forward for a TEdit, you just modify the Font.Size property. However, this got me thinking about what if I wanted to modify the text color of the TEdit and not just the Font.Size or Font.FamilyName. This is not so simple. In looking at the Style for the TEdit, you will see that there is not TText element that you would typically find (e.g. in a TLabel or TGroupBox). Instead, there is a 'content' style, which appears to be what I want, but there are no child elements of 'content'. Again, looking at the source code, I determined that the style element called 'foreground' is what I want. So, the trick is to modify the Brush property of the 'foreground' style element using the Style Designer. Once I did this, my TEdit was displaying colored text.

This is all well and good, but going back to the StringGrid, we don't have a style element to access in the Style Designer to make this kind of change. So, my next approach was to try to modify the text color in code. When I looked at the source code, I discovered that the 'foreground' style element is a TBrushObject and is used to populate the property of the FontFill public property. And FontFill is used to draw the text.

Well, now we're getting somewhere. Or, so I thought. I dropped another TEdit (Edit2) on the form and I created an OnCreate event handler on my FMX form and added the following code:

procedure TForm21.FormCreate(Sender: TObject);
begin
Edit2.FontFill.Color := claBlueViolet;
end;

I then ran my app, fully expecting to see blue colored text in my TEdit. Unfortunately, nothing changed at all. The color of the text in the Edit2 was still black. Stepping through the code revealed that the TEdit will override the FontFill property values with the values defined in the style whenever ApplyStyle is called. Setting the FontFill.Color property in the FormCreate event is too early. It just gets overridden. However, ApplyStyle is protected, and I certainly did not want to have to create a new descendant simply to change the font color.

What I needed was a way to hook into the ApplyStyle process so that I make changes to the style. This is where the OnApplyStyleLookup event comes in. I deleted the above Edit2.FontFill.Color assignment from the FormCreate event handler and created a new event handler for Edit2's OnApplyStyleLookup event as shown:

procedure TForm21.Edit2ApplyStyleLookup(Sender: TObject);
begin
Edit2.FontFill.Color := claBlueViolet;
end;

Now, when I run my app, Edit2 does indeed have blue-colored text.

Of course, the question still remains how to do this for the TStringGrid. I had tried all kinds of combinations of trying to access the style elements of the grid and the columns and did not make any progress. However, with the above information, I had a new approach. What if I could handle the OnApplyStyleLookup event for the individual cells, like I did for the stand-alone TEdit?

The trick, of course, is to get access to the individual cell controls (i.e. the TTextCell instances) and not just the strings in the Cells property. To do this, we can use the CellControlByRow method of a grid column. Below is my updated FormCreate event handler. After initializing a few of the Cells to show some actual text, I then iterate through the grid's Columns and for each column I use the CellControlByRow method to get the TTextCell instance. This allows me to assign a new event handler for the OnApplyStyleLookup event.

procedure TForm21.FormCreate(Sender: TObject);
var
Col, Row: Integer;
CellCtrl: TStyledControl;
begin
StringGrid1.Cells[ 0, 0 ] := 'Cell00';
StringGrid1.Cells[ 1, 0 ] := 'Cell10';

StringGrid1.Cells[ 0, 1 ] := 'Cell01';
StringGrid1.Cells[ 1, 1 ] := 'Cell11';


for Col := 0 to StringGrid1.ColumnCount - 1 do
begin
for Row := 0 to StringGrid1.RowCount - 1 do
begin
CellCtrl := StringGrid1.Columns[ Col ].CellControlByRow( Row );
if ( CellCtrl <> nil ) and ( CellCtrl is TTextCell ) then
TTextCell( CellCtrl ).OnApplyStyleLookup := GridCellApplyStyleLookup;
end;
end;
end;


The GridCellApplyStyleLookup event is a TNotifyEvent, meaning that it takes a single Sender parameter of type TObject. Fortunately, the Sender parameter for this event is the TStyledObject that needs to be styled. In this case, Sender is a TTextCell. Therefore, in the implementation below, I check to make sure that Sender is not nil and that it is indeed a TTextCell instance. I then use that instance to modify the FontFill and Font properties.

procedure TForm21.GridCellApplyStyleLookup( Sender: TObject );
var
TC: TTextCell;
begin
if ( Sender <> nil ) and ( Sender is TTextCell ) then
begin
TC := TTextCell( Sender );

TC.FontFill.Color := claBlueViolet;
TC.Font.Family := 'Times New Roman';
TC.Font.Style := [ TFontStyle.fsBold ];
TC.Font.Size := 14;
end;
end;

Now, when I run the app, all of the cells of the string grid display their text in blue-violet using a 14 point Times New Roman font. Using the same technique would also allow me setup different OnApplyStyleLookup event handlers to change the settings between columns, etc.

A final note regarding the FMX TStringGrid. The header cells for the grid are NOT handled by the Cells property. The text displayed in the grid's header is managed by each TStringColumn's Header property.

--
Ray Konopka
[/more]

черех ж..у конечно, но хоть как-то..
а отображение db таблицы вообще геморрой ещё тот.
Автор: deks
Дата сообщения: 27.10.2011 01:01
LG Team

Впечатление от прочтения солюшена - OMFG!))

Да, KsDev причесали и немного доделали, - чтобы работало без падений на очевидных местах! Но помимо "чтобы работало" от FMX нужно ещё "чтобы пользоваться было можно" - а вот с этим пока напряженно..

Думаю, сама по себе идея "стилей" - это здорово! Опять же в css/html5 тоже есть стили, то есть "стили = trend". Но как то слабовата концепция стилей FMX, имхо.. Я бы предметнее делал "наследование" стилей (сейчас можно заменить стиль, но не "уточнить его" - просто делается копия) и более последовательно подошел бы к том свойствам компонента, которые определяются стилем. Сейчас что устанавливается в инспекторе объекта, а что можно править стилем - вообще не явно..

Автор: snike555
Дата сообщения: 27.10.2011 21:15
Я правильно понимаю что уже есть XE 2 Update 2 или я не правильно понимаю? http://docwiki.embarcadero.com/RADStudio/en/Release_Notes_for_XE2_Update_2
Автор: deks
Дата сообщения: 28.10.2011 10:31
snike555

Нет. Рассылки про новый update 2 не было, в регзоне ничего такого нет, списка фиксов нет (по ссылке из docwiki выдается список для update1).

Думаю, это - приготовление к релизу update2, просто страничка попала в wiki раньше времени и по ошибке! хотя страничка похожа на правду (FMX / iOS теперь совместим с XCode 4.2+iOS5)
Автор: HeMet
Дата сообщения: 29.10.2011 15:15
Нашёл баг компилятора XE2 (и XE тоже). Если есть два перегруженных метода (функции, процедуры), где один принимает аргумент типа Т, а другой анонимную функцию с типом результата Т. При вызове метода с анонимной функцией вылетает AV.

Код для примера:


Код:
program OverloadWithAnonMethodBug;

{$APPTYPE CONSOLE}

uses
SysUtils;

type
TStringProvider = reference to function: string;

procedure Overloaded(showText: string); overload;
begin
Writeln(showText);
end;

procedure Overloaded(showText: TStringProvider); overload;
begin
Writeln(showText);
end;

var
anonymous: TStringProvider;

begin
try
Overloaded('text');
// в этом случае вылезет AV
Overloaded(
function: string
begin
Result := 'Cause an AV';
end);

// а тут вызов пройдет без приключений
// anonymous :=
// function: string
// begin
// Result := 'Cause an AV';
// end;
// Overloaded(anonymous);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Автор: Shkola Igor
Дата сообщения: 01.11.2011 00:22
При компиляции проекта с использованием teechart возникает проблема с русскими шрифтами - в teechart Editor все названия отображаются иероглифами. В fast report при выводе текста из БД - тоже иероглифы. В чем может быть проблема?
Автор: deks
Дата сообщения: 01.11.2011 10:41
Shkola Igor

Однозначно - в кодировке. Вопрос - в кодировке чего! сначала нужно проверить шрифты - какие установлены и какие используются. Потом - в кодировке подключения к БД, поддерживает ли она русский язык.
Автор: Arioch1
Дата сообщения: 02.11.2011 12:48
Никто не нарыл прямые ссылки с altd.embarcadero.com/download/radstudio/xe2 на Help Update 1, Delphi XE2 Update 2 Delphi XE2 install ISO with Update 2 ?
Все ссылки нашлись. Ура, товарищи.
Автор: deks
Дата сообщения: 02.11.2011 13:40
В топике про варез написали:


Цитата:
Давно пора по p2p раздавать...


Абсолютно согласен!

Задумал такое: написать на QC баг-репорт на медленную скачку и предложить p2p downloader организовать!)

Когда гляжу на 64kb/s на своем 50mb/s канале - сразу закрадывается опасение, что тут чего то нет так!
Автор: mcka
Дата сообщения: 03.11.2011 09:22
Всем привет!
Перевожу проект с Ansi на Unicode:

for i := 0 to 33 do
showmessage(Chr(Ord('А') + i)); // А - русская

в Ansi это работает, а unicode нет, так как в Ansi showmessage(Chr(Ord('Щ'))) - тоже самое, что и showmessage('Щ'); а в unicode нет!

пришлось написать так: chr($0410 + i) - работает, но читая код непонятно, есть еще идеи?
Автор: Arioch1
Дата сообщения: 03.11.2011 13:00
for i := 0 to 33 do
showmessage(Chr(Ord(AnsiChar('А')) + i)); - а так ?

Нет, тaк не сработает - зато сработает наоборот
Chr(Ord(WideChar('А'))

Добавлено:
Ну и банальное до жути

for i := 0 to 33 do
showmessage( AnsiChar(Byte((Ord('А') + i))));

Добавлено:
> но читая код непонятно, есть еще идеи?

а это означает, что нужно объявить свою функцию AnsiChr: Byte => AnsiChar, пометить её inline; и будет пoнятно.
Автор: mcka
Дата сообщения: 03.11.2011 16:58
Arioch1 Chr(Ord(WideChar('А')) - спасибо, то что нужно.
Автор: Arioch1
Дата сообщения: 03.11.2011 17:03
http://qc.embarcadero.com/wc/qcmain.aspx?d=100685

Добавлено:
var c: char;
....
for c in 'АБВГДЕЁЖЗ' do showmessage(c);
for c in ['А'..'Я'] do showmessage(c);
Автор: mcka
Дата сообщения: 04.11.2011 09:38
Arioch1 Спасибо.

for c in 'АБВГДЕЁЖЗ' do showmessage(c); - работает

var c : char; // или widechar
begin
for c in ['А'..'Я'] do showmessage(c); - НЕ работает в unicode!
end;


var c : ['А'..'Я'];
begin
for c in ['А'..'Я'] do showmessage(c); - работает!
end;

Б... какой сырой компилятор.
Автор: LLIAKAJl
Дата сообщения: 04.11.2011 15:50
Embarcadero RAD Studio XE2 проблема с компиляцией
При компиляции программ (даже пустой формы) выдается всегда одна ошибка

"Compiling Project1.dproj (Debug, Win32)

[MSBuild Error] The element beneath element is unrecognized."

добавил 64 розрядный компилятор все равно не помогло

ОС Windows 7 x64

NET framework обновлял, в чем может быть проблема?
Автор: Eternal_Shield
Дата сообщения: 04.11.2011 19:31
mcka
Сколько раз советовали использовать CharInSet для юникодных проверок? Наверное, просто так эти советы раздавали разработчики, а у нас всё как всегда: с любой проблемой мы сталкиваемся впервые;

И,на последок, элемент множества равен 1 байтам, поэтому это работает:

Код:
var c : ['А'..'Я'];
begin
for c in ['А'..'Я'] do showmessage(c); - работает!
end;
Автор: iHastr
Дата сообщения: 06.11.2011 18:35
Извиняюсь, если задаю вопрос не здесь. Задача простая: как в Windows 7 банально пикнуть системным динамиком (пищалкой-спикером)? Если в RAD Studio (версия студии не имеет значения) вызвать функцию, к примеру:
Beep(400, 500); // C++Builder
Winapi.Windows.Beep(400, 500); // Delphi
звук раздастся из колонок, но не из пищалки! Это ограничение Windows 7. Перерыв весь инет, так и нашлось решение. Один вариант с портами таймера указан здесь. Для 64-битной версии Windows 7 всё ещё сложнее.

Принципиально нужно, чтобы программа пищала именно системным динамиком в Windows 7, а именно плагин Beeper для QIP, подробнее здесь.
Автор: Ludens
Дата сообщения: 06.11.2011 19:58
Подскажите, пожалуйста, имеет ли смысл переходить с XE на XE2, если не пишешь ни под 64, ни под Мак?
Грубо говоря, появились ли в XE2 дополнительные к XE возможности, помимо новых ОС и файерманки? Добавлены ли новые фичи в язык Дельфи, в RAD-интерфейс, в базовые библиотеки? Есть ли какие-то улучшения старых инструментов, хотя бы мелкие?
Автор: Frodo_Torbins
Дата сообщения: 06.11.2011 21:30
Ludens
Конечно есть, взять хотя бы биндиги и стили.
Автор: Arioch1
Дата сообщения: 06.11.2011 21:53

Цитата:
var c : ['А'..'Я'];
begin
for c in ['А'..'Я'] do showmessage(c); - работает!
end;


Это то же самое, что var c: AnsiChar; с небольшими несузественными отличиями.
А то, что оно работает, мы вроде видели.

Вот попробуй выпендриться с var c: WideChar('А')..WideChar('Я')

Добавлено:

Цитата:
Сколько раз советовали использовать CharInSet для юникодных проверок?


А при чёи тут проверки множеств? Где вы в этих примерах видели хоть одну проверку ?

Добавлено:

Цитата:
нужно, чтобы программа пищала именно системным динамиком


а если у пользователя проводки спикера заведены на звуковую карту ?
На все случаи запчастей не напасёшься, если Microsoft запретил - то запретил. А потом будут ещё обновления, Win8 будет - и каждый раз будешь исктаь как обмануть Майкрософт ?

Могу посоветовать поизучать SpeedFan - он как-то с портами работает.
Автор: Arioch1
Дата сообщения: 07.11.2011 08:04

Цитата:
http://qc.embarcadero.com/wc/qcmain.aspx?d=100685

Очаровательный комментарий мне там вставили.
Типа это кажется старый баг с D2009 (что в общем очевидно) под номером 65632

Интересант, подумал я http://qc.embarcadero.com/wc/qcmain.aspx?d=65632
404, нет такого номера, сказал сервер
Шарман, подумал я. Действительно, зачем баги фиксить, если их можно просто удалять...
Автор: Eternal_Shield
Дата сообщения: 07.11.2011 08:37
Arioch1

Цитата:
А при чёи тут проверки множеств? Где вы в этих примерах видели хоть одну проверку ?

Да, действительно, и где? Надеюсь, мы знаем как for-in внутри устроен? Если да, то к чему эти 2 вопроса?

Посмотрел я чудо-баг 100685 ... и послали вас в правильном направлении: учите основы юникодофикации и всё. Хотите унифицировать преобразование Ord <> Char - пишите перегруженные функции для необходимых типов;

Зю: А баг, уверен на 95%, закроют.
Автор: Arioch1
Дата сообщения: 07.11.2011 09:28
Вопрос остаётся. Где тут множества ? Конкретнее, где тут проверка вхождения символа в множество ?
Вы действительно считаете, что for работает через CharInSet ??? Или как гугл, увидели слово "in" и выдали все, что к нему относится в любом контексте?

Ord и Chr - стандартные функции Паскаля. И они должны работать взаимно-обратно. Без чтения справки. В которой все равно чушь написана.

Баг имени D2009 как говорят "...and it is sill Open". Так насчёт "закроют"
Впрочем, вспоминая сколько лет им понадобилось, чтобы пофиксить MakeInstance... Могут и к 2019 не успеть.

Добавлено:

Цитата:
Конечно есть, взять хотя бы биндиги и стили.

А лично мне понравились class constructor

Наконец-то можно делать сложные типы, проверять их окрректность, и не тащить в exe кучу лишнего кода, если тип в итоге не нужен.
Когда-то писал на D5 программки размером <10KB с заменой System.pas - приходилось сильно думать какие части и как выключать. С C.C. было бы намного проще... если бы он тогда был
Автор: Eternal_Shield
Дата сообщения: 07.11.2011 12:25
Arioch1

Цитата:
Где тут множества ? Конкретнее, где тут проверка вхождения символа в множество ?
Вы действительно считаете, что for работает через CharInSet ??? Или как гугл, увидели слово "in" и выдали все, что к нему относится в любом контексте?

Значит попытайтесь узнать таки, про что речь ... а потом уже троллить; Зачем вы в бочку лезите, а? Я ещё никого не оскорбил тут, а меня уже с гуглом сравняли (ещё одна причина не любить гугло-кодеров...без гугла, как без мозгов) и говном полили;


Цитата:
Ord и Chr - стандартные функции Паскаля. И они должны работать взаимно-обратно.

Ключевое слово выделил ... а если уже совсем серьзно, то откройте глаза, у Chr входящий аргумент типа BYTE ... не наводит на мысли определённые, не?
Автор: tomor
Дата сообщения: 07.11.2011 13:27
TListView ведет себя странно. В режиме Report ставлю видимыми группы. Под IDE все нормально: группы видны, подзаголовки видны, иконки сворачивания видны. Запускаю отдельно - Subtitles не видны и не видны иконки сворачивания
Автор: Arioch1
Дата сообщения: 07.11.2011 13:58
Вы очень разнообразно избегаете ответа на простой вопрос: где же именно в for-var-in-range должен использоваться ваш совет "Сколько раз советовали использовать CharInSet(var, set) для юникодных проверок?" ?


Цитата:
у Chr входящий аргумент типа BYTE ... не наводит на мысли определённые

Наводит. На очевидную мысль, что в справке написана чушь (увы, но не в первый раз).
Иначе бы не работали примеры выше, с параметром #$410 + i.
Надеюсь, вам очевидно, что такое значение > High(Byte) ?
У вас еcть другое объяснение, почему именно так функция работает правильно ?

Автор: iHastr
Дата сообщения: 07.11.2011 14:50
Arioch1
Цитата:
Когда-то писал на D5 программки размером <10KB с заменой System.pas - приходилось сильно думать какие части и как выключать. С C.C. было бы намного проще... если бы он тогда был

Простая программка без главной формы, добавлена всего пара строчек кода в .cpp-файл проекта. В C++Builder 2009 скомпилированный exe-шник весил 731 КБ, а в С++Builder XE2 целых 2,69 МБ (всякие Runtime Packages и Dynamic RTL отключены в настройках проекта). Ну и аппетиты :)
Автор: Bill_PHO
Дата сообщения: 07.11.2011 16:12
Не пробовал ли кто в ХЕ2 сделать проект на FireMonkey для MAC OSX (х86) с коннектом к MSSQL Server?
У меня такой проект компилируется с ошибкой: F1026 File not found 'Data.DBXMSSQL.dcu'.
И правда. Поиском на компе обнаруживаются такие dcu, но только для платформ Win x86, x64.
Подключения к ORACLE, Interbase, MySQL компилируются без ошибок.
Ошибка компиляции возникает как при использовании XE2_Update1 так и XE2_Update2.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738

Предыдущая тема: Как сделать offline версию сайта со встроенным браузером?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.