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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2013, 11:54   #21
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Почему (Font = nil) когда parent у Label = nil?
С чего? Вот в примере фонт существует независимо от наличия парента
Код:
procedure TForm1.Button1Click(Sender: TObject);
var xLabel: TLabel;
begin
  xLabel:=TLabel.Create(nil);
  xLabel.ParentFont:=False;
  Label1.Caption:=xLabel.Font.Name;
  xLabel.Parent:=Self;
  Label2.Caption:=xLabel.Font.Name;
  xLabel.Parent:=nil;
  Label3.Caption:=xLabel.Font.Name;
  xLabel.Free;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.06.2013, 12:50   #22
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Да, действительно надо было parent:=nil выставить.

Последний раз редактировалось Человек_Борща; 06.06.2013 в 12:06.
Человек_Борща вне форума Ответить с цитированием
Старый 06.06.2013, 12:07   #23
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Собственно как считать шрифт обратно в TLabel.Font?

Пробую так:
Код:
function TNativeXMLHelper.ReadFont(aName: UTF8String): TFont;
  function Str2FontStyles(aStylesStr: string): TFontStyles;
  begin
    Result := [];
    if Pos('B', aStylesStr) > 0 then
      Result := Result + [fsBold];
    if Pos('I', aStylesStr) > 0 then
      Result := Result + [fsItalic];
    if Pos('U', aStylesStr) > 0 then
      Result := Result + [fsUnderline];
    if Pos('S', aStylesStr) > 0 then
      Result := Result + [fsStrikeOut];
  end;

var
  Node: TXmlNode;
  Font: TFont;
begin
  Font := TFont.Create;
  try
    Font.Assign(Result); //Получаю то, что имеется в Result ТУТ AV ОШИБКА
    if NodeExists(aName, Node) then
    begin
      with Node do
      begin
        Font.Name := ReadAttributeUnicodeString('Name'); //Ошибка ещё здесь, тоже AV
        Font.Size := ReadAttributeInteger('Size');
        Font.Style := Str2FontStyles(ReadAttributeUnicodeString('Styles'));
        Font.Pitch := TFontPitch(Byte(ReadAttributeInteger('Pitch')));
        Font.Color := StringToColor(ReadAttributeUnicodeString('Color'));
        Font.Charset := ReadAttributeInteger('Charset');
      end;
    end;
    Result.Assign(Font); //Возвращаю в результат изменения из моего Font, или же самого себя, если NodeExists = False
  finally
    FreeAndNil(Font);
  end;
end;

Как правильно шрифт из файла обратно прочитать?

TLabel создаю таким:
Код:
  fLabel := TLabel.Create(nil);
  fLabel.Tag := fID;
  fLabel.ParentColor := False;
  fLabel.ParentFont := False;
  fLabel.Visible := False;
Читаю в него так:
Код:
        Text := TPrintCardText.Create;
         ....
        with Nodes[t] do
        begin
        ....
        //Text.Text, где 2й Text - это property Text:TLabel read fLabel ...
          Text.Text.BoundsRect := ReadRect('BoundsRect');
          Text.Text.Font := ReadFont('Font');
         ....
        end;
Человек_Борща вне форума Ответить с цитированием
Старый 06.06.2013, 12:24   #24
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Font.Assign(Result); //Получаю то, что имеется в Result ТУТ AV ОШИБКА
Result-а то еще нет

или
Код:
Font := TFont.Create;
// здесь работа только с Font
Result:=Font;
// убивать Font не надо, об этом должна позаботиться вызывающая программа
или
Код:
Result:=TFont.Create;
// здесь работа только с Result
// убивать аналогично не надо
и
Код:
 Font:=ReadFont('Font');
 Text.Text.Font.Assign(Font);
 Font.Free;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 06.06.2013 в 12:41.
Аватар вне форума Ответить с цитированием
Старый 06.06.2013, 12:43   #25
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Так сделал:
Код:
function TNativeXMLHelper.ReadFont(aName: UTF8String): TFont;
  function Str2FontStyles(aStylesStr: string): TFontStyles;
  begin
    Result := [];
    if Pos('B', aStylesStr) > 0 then
      Result := Result + [fsBold];
    if Pos('I', aStylesStr) > 0 then
      Result := Result + [fsItalic];
    if Pos('U', aStylesStr) > 0 then
      Result := Result + [fsUnderline];
    if Pos('S', aStylesStr) > 0 then
      Result := Result + [fsStrikeOut];
  end;

var
  Node: TXmlNode;
  Font: TFont;
begin
  Result := nil;
  if NodeExists(aName, Node) then
  begin
    with Node do
    begin
      Font := TFont.Create;
      Font.Name := ReadAttributeUnicodeString('Name');
      Font.Size := ReadAttributeInteger('Size');
      Font.Style := Str2FontStyles(ReadAttributeUnicodeString('Styles'));
      Font.Pitch := TFontPitch(Byte(ReadAttributeInteger('Pitch')));
      Font.Color := StringToColor(ReadAttributeUnicodeString('Color'));
      Font.Charset := ReadAttributeInteger('Charset');
      Result := Font;
    end;
  end;
end;
Работает. Но кто отвечает за освобождение Font? Сам TLabel теперь?
Человек_Борща вне форума Ответить с цитированием
Старый 06.06.2013, 12:51   #26
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Так как в конце #24, то явное удаление. Если Text.Text.Font:=ReadFont('Font'); и это работает, то проверить нет ли утечек. Так никогда не пользовался

ADD

Код:
procedure TControl.SetFont(Value: TFont);
begin
  FFont.Assign(Value);
end;
При втором варианте все равно нужно явное удаление
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 06.06.2013 в 12:56.
Аватар вне форума Ответить с цитированием
Старый 06.06.2013, 13:54   #27
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Разобрался... Теперь формирую картинку-результат:
Вот так Label'ы лежат в редакторе:


А вот так в изображении для пред. просмотра:


Изображение для пред. просмотра строится так:
Код:
var
  Img: TBitmap;
  i: Integer;
begin
  Img := TBitmap.Create;
  try
    Img.Assign(fSrcBitmap);
    for i := 0 to Count - 1 do
    begin
      Img.Canvas.Font := Items[i].Text.Font;
      Img.Canvas.TextOut(Items[i].Text.BoundsRect.TopLeft.X,
        Items[i].Text.BoundsRect.TopLeft.Y - Items[i].Text.Height,
        Items[i].Text.Caption);
    end;
    aSsignTo.Picture.Assign(Img);
  finally
    FreeAndNil(Img);
  end;
end;
Как позиционировать на Label'ы на картинку так же как они лежат в редакторе?
Вроде бы правильно все.. но в итоге Label рисуется ниже, чем он лежит в редакторе.

--Разобрался--
Код:
var
  Img: TBitmap;
  i: Integer;
begin
  Img := TBitmap.Create;
  try
    Img.Assign(fSrcBitmap);
    for i := 0 to Count - 1 do
    begin
      Img.Canvas.Font := Items[i].Text.Font;
      Img.Canvas.TextOut(Items[i].Text.BoundsRect.TopLeft.X -
        Items[i].Text.Font.Size, Items[i].Text.BoundsRect.TopLeft.Y -
        Items[i].Text.Height - Items[i].Text.Font.Size, Items[i].Text.Caption);
    end;
    aSsignTo.Picture.Assign(Img);
  finally
    FreeAndNil(Img);
  end;
end;
Надо просто учитывать размер шрифта, а из высоты вычитывать высоту Label'а.
На белом фоне работает..

--НОВОЕ--
А если рисовать на черном или на любом другом, то вокруг текста рисуется странная белая рамка... как лечить?

Последний раз редактировалось Человек_Борща; 06.06.2013 в 14:35.
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
редактируемое окно что бы можно было менять текст Николай_Kolumb Помощь студентам 5 25.04.2012 18:00
График (канва) m0dE Помощь студентам 3 11.10.2011 09:04
treeview и канва. blackstersl Мультимедиа в Delphi 4 06.06.2009 10:02
C++ for DOS (задачка, граф.редактор) Nixtone Общие вопросы C/C++ 1 18.05.2009 20:58
Канва bekart Общие вопросы Delphi 2 29.11.2007 22:54