1

(7 відповідей, залишених у Pascal/Delphi)

koala написав:

А, ну і аргументи треба вказувати і там, і там. У вас у класі проголошена процедура без аргументів.

Дякую!Коли вказала аргументи вийшла ця помилка:

Error:Duplicate identifier "Canvas"
Hint: Identifier already defined in unit CONTROLS
Error: Duplicate identifier "Text"
Hint: Identifier already defined in unit CONTROLS

Потім я спробувала виправити це так:

Прихований текст
type
  TSuperSubLabel = class(TLabel)


  private

  protected
      procedure SuperSub(const aRect:TRect; X, Y:integer);
  public

  published
    property AutoSize;
    property Caption;
    property Font;


  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Standard',[TSuperSubLabel]);
end;

procedure TSuperSubLabel.SuperSub(const aRect:TRect; X, Y:integer);
var
    i,xx:integer;
    subScript, superScript:boolean;
    DefFont:TFont;

begin
Canvas.FillRect(aRect);
DefFont:=TFont.Create;
DefFont.Assign(Canvas.Font);
with Canvas do begin
  xx:=X;

  for i:=1 to length(Text) do
  begin
   if Text[i-1] = '_' then subScript:=true
                      else subScript:=false;
   if Text[i-1] = '^' then superScript:=true
                      else superScript:=false;


   if  (Text[i] = '_')  and   (Text[i] = '^')  then
   begin

      if ( subScript ) then
      begin
        Canvas.Font.Height:=Canvas.Font.Height*8 div 10;
        Canvas.TextRect(Rect(xx,aRect.Top,xx+TextWidth(text[i]),aRect.Bottom),xx, Y+abs(8*Canvas.Font.Height-10*DefFont.Height) div 10, text[i]);
        inc(xx,TextWidth(text[i]));
      end;

      if ( not subScript) and ( not superScript ) then
      begin
        Canvas.Font:=DefFont;
        Canvas.TextRect(Rect(xx,aRect.Top,xx+TextWidth(text[i]),aRect.Bottom),xx, Y, text[i]);
        inc(xx,TextWidth(text[i]));
      end;

      if ( superScript ) then
      begin
        Canvas.Font.Height:=Canvas.Font.Height*9 div 10;
        Canvas.TextRect(Rect(xx,aRect.Top,xx+TextWidth(text[i]),aRect.Bottom),xx, Y-abs(8*Canvas.Font.Height-10*DefFont.Height) div 20, text[i]);
        inc(xx,TextWidth(text[i]));
      end;
      Canvas.Font:=DefFont;
   end;

  end;
end;
 DefFont.Free;
end;
end.   

Верхні та нижні індекси не відображуються, зате немає помилок xD
Дякую ще раз за допомогу, далі вже буду переписувати код щоб все відображалося.

2

(7 відповідей, залишених у Pascal/Delphi)

koala написав:

SuperSub є елементом класу TSuperSubLabel, відповідно, поза класом треба уточнювати, до якого класу вона належить:

 procedure TSuperSubLabel.SuperSub(...)

Дякую за відповідь! Нажаль я так пробувала вже, але помилка не виправлялась :(

3

(7 відповідей, залишених у Pascal/Delphi)

Всім добрий день! Намагаюсь зробити компонент на основі TLabel з можливістю відображення верхніх та нижніх індексів. Ось мій код

type
  TSuperSubLabel = class(TLabel)

  private

  protected
  procedure SuperSub;
  public

  published
    property AutoSize;
    property Caption;
    property Font;

  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Standard',[TSuperSubLabel]);
end;

procedure SuperSub(Canvas:TCanvas; const aRect:TRect; X, Y:integer ; text:String);
var i,xx:integer;
    subScript, superScript:boolean;
    DefFont:TFont;


begin
Canvas.FillRect(aRect);
DefFont:=TFont.Create;
DefFont.Assign(Canvas.Font);
with Canvas do begin
  xx:=X;

  for i:=1 to length(text) do
  begin
   if text[i-1] = '_' then subScript:=true
                      else subScript:=false;
   if text[i-1] = '^' then superScript:=true
                      else superScript:=false;


   if  (text[i] = '_')  and   (text[i] = '^')  then
   begin

      if ( subScript ) then
      begin
        Canvas.Font.Height:=Canvas.Font.Height*8 div 10;
        TextRect(Rect(xx,aRect.Top,xx+TextWidth(text[i]),aRect.Bottom),xx, Y+abs(8*Canvas.Font.Height-10*DefFont.Height) div 10, text[i]);
        inc(xx,TextWidth(text[i]));
      end;

      if ( not subScript) and ( not superScript ) then
      begin
        Canvas.Font:=DefFont;
        TextRect(Rect(xx,aRect.Top,xx+TextWidth(text[i]),aRect.Bottom),xx, Y, text[i]);
        inc(xx,TextWidth(text[i]));
      end;

      if ( superScript ) then
      begin
        Canvas.Font.Height:=Canvas.Font.Height*9 div 10;
        TextRect(Rect(xx,aRect.Top,xx+TextWidth(text[i]),aRect.Bottom),xx, Y-abs(8*Canvas.Font.Height-10*DefFont.Height) div 20, text[i]);
        inc(xx,TextWidth(text[i]));
      end;
      Canvas.Font:=DefFont;
   end;

  end;
end;
 DefFont.Free;
end;
end. 

Але видає помилку:"Error:Forward declaration not solved '' SuperSub'' "
Можливо ви знаєте посібник з цієї теми але не на freepascal.org?
Бо я тут прочитала статтю https://wiki.freepascal.org/How_To_Writ … _Component, але не знайшла потрібної інформації:(

4

(7 відповідей, залишених у Pascal/Delphi)

koala написав:
polinakos написав:

Тільки питання що саме треба задавати в depth?

Число, "глибину" графіка. В документації (почніть уже її читати!) рекомендують ставити 10 або 20.

Ахаха, добре, добре! Все більше Вас не турбую. Ще раз дякую:)

5

(7 відповідей, залишених у Pascal/Delphi)

koala написав:

Схоже, методичку писали з Delphi. За документацією, в Lazarusівському TAChart треба не View3d вмикати, а depth задавати.

Дякую за відповідь!
Зараз прочитаю це і спробую переробити. Тільки питання що саме треба задавати в depth? Бо мені треба побудувати графік  з можливістю вибору між плоским зображенням та обʼємним за допомогою компонента  RadioGroup.

6

(7 відповідей, залишених у Pascal/Delphi)

Якщо це важливо... То ось весь код:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, CheckLst, StdCtrls,
  ExtCtrls, TAGraph, TASeries;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Chart1: TChart;
    Chart1LineSeries1: TLineSeries;
    CheckListBox1: TCheckListBox;
    EditA: TEdit;
    EditB: TEdit;
    EditM: TEdit;
    LabelA: TLabel;
    LabelB: TLabel;
    LabelM: TLabel;
    RadioGroup1: TRadioGroup;
    procedure Button1Click(Sender: TObject);
    procedure CheckListBox1Click(Sender: TObject);

  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}
function f1 (a: real):real;
begin
  result := ln(a);
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
   x, a, b, h: real;
   i, M :integer;
begin
    CheckListBox1.Checked[0] := true;
    Chart1LineSeries1.Clear;
    if RadioGroup1.ItemIndex = 0  then
    Chart1.View3D := false;
    if RadioGroup1.ItemIndex = 1 then
    Chart1.View3D := true;
    a := StrToFloat(EditA.Text);
    b := StrToFloat(EditB.Text);
    M := StrToInt(EditM.Text);
    h := (b-a) / M;
    for i:= 0 to M do
      begin
        x:= a + h*i;
        Chart1LineSeries1.AddXY(x,f1(x), ' ', clRed);
        end;

end;
  
procedure TForm1.CheckListBox1Click(Sender: TObject);
begin
  if CheckListBox1.Checked[0] then
    Chart1LineSeries1.Active := true
  else
    Chart1LineSeries1.Active := false;
end;

end.

7

(7 відповідей, залишених у Pascal/Delphi)

Програма чомусь не баче властивість View3D.

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
  case RadioGroup1.ItemIndex of
    0: Chart1.View3D := false;
    1: Chart1.View3D := true;
end; 
end;  

я ще так спробувала

if RadioGroup1.ItemIndex = 0  then
    Chart1.View3D := false;
    if RadioGroup1.ItemIndex = 1 then
    Chart1.View3D := true;

але однаково виходить помилка:

Compile Project, Target: project1: Exit code 1, Errors: 2
unit1.pas(57,12) Error: identifier idents no member "View3D"
unit1.pas(59,12) Error: identifier idents no member "View3D"

В інтернеті шукала як зробити обʼємний графік функції в Lazarus  , але не знайшла (((( Остання надія тут. До речі, в методичці було написано : "У вікні Інспектора Об'єктів для компонента Chart1 виберемо властивість View3D і установимо його значення рівним false." ЗНОВ але цього немає там.