[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x

Pascal

Pascal is an influential imperative and procedural programming language, largely (but not exclusively) intended to teach students structured programming and data structuring. Pasca was implemented on a wide range of architectures, from early PCs to mainframes. Pascal derivatives include OOP-based Object Pascal (used in Delphi and Lazarus/Free Pascal). Pascal is a purely procedural language and includes control statements with reserved words, but has many data structuring facilities and other abstractions like type definitions, records, pointers, enumerations, and sets.

Share tech news, updates, or what's on your mind.

Sign up to Post

I'm trying to chop up an ansi string with the Delete function.  I'm getting a compiler error on that line.

program textProcess6;
uses sysutils;
{$H+}
var
  namein,nameout: string[255];
  raw_text,processed_text: ansistring;
  textin,textout: text;
begin
  namein := 'input_file.txt';
  nameout := 'output_file.txt';
  assign(textin,namein);
  reset(textin);
  assign(textout,nameout);
  rewrite(textout);
  while not eof(textin) do begin
    readln(textin,raw_text);
	processed_text := Delete(raw_text,1,5);
    writeln(textout,processed_text);
  end;
  close(textout);
end.

Open in new window

0
Learn SQL Server Core 2016
LVL 12
Learn SQL Server Core 2016

This course will introduce you to SQL Server Core 2016, as well as teach you about SSMS, data tools, installation, server configuration, using Management Studio, and writing and executing queries.

I am going to be doing some simple text processing with Free Pascal.  I will have to read in a text file, chop the text up a bit, and then write to a new file.  I looked for a sample program online and it talked about a dat file.  I don't remember how this relates to a txt file.  My input file is a txt file.

Years ago I was working in a unix environment, and I vaguely remember doing things with < or > to tell the operating system what input file to use and what output file to use.  How do you tell Free Pascal what your input and output files are?
0
I am going to be doing some simple text processing with Free Pascal.  I would like to use a debugger of some kind that allows me to see the values of variable, step through execution, etc.  I would like something easy to set up and use.  Lightweight, too.
0
I have a need to write some Pascal programs, after several decades' hiatus.  I downloaded a free version of Pascal from www.freepascal.org.  I also found https://www.freepascal.org/docs-html/current/user/user.html#userch2.html.  

My helloworld program is working nicely, but it was stored to an awkward location: C:\FPC\3.0.4\bin\i386-win32.  Is it possible to save my files to a subdirectory?

When I start the program, I get a very old-fashioned kind of window.  I can't figure out how to close a program after I've saved it (except for killing Pascal entirely).

I would rather use notepad++ for editing my programs.

There is mention of Lazarus but I don't have any experience with that.  I have downloaded and installed it but am not sure what to do next with it.
0
So I am trying to create a program that takes a list of integers typed in by the user, puts them into order and prints them to the screen. However, my compiler just shows nothing after I type in the list. No output whatsoever.
I get the following hint: Variable "RefListe" does not seem to be initialized. But I cannot make sense of that right now.

Can anyone tell me why this doesn't work?

program TesteSortiereListe(input, output);

  type
  tNatZahl = 0..maxint;
  tRefListe = ^tListe;
  tListe = record
             info : tNatZahl;
             next : tRefListe;
           end;

  var
  RefListe : tRefListe;


procedure SortiereListe (var ioRefListe:tRefListe);
{ Sorts a linked list in ascending order }

  var
  RefAnfang,
  Vorgaenger,
  aktuell:tRefListe;

begin
  RefAnfang := ioRefListe;
  while ioRefListe <> nil do
  {Go through the entire list}
  begin
  vorgaenger := ioRefListe;
  ioRefListe := ioRefListe^.next;
  aktuell := ioRefListe;
    if aktuell^.info < RefAnfang^.info then
    {Element is the smallest element found so far}
      begin
      Vorgaenger^.next := aktuell^.next;
      aktuell^.next := RefAnfang;
      RefAnfang := aktuell;
      end
    else if ioRefListe^.info > aktuell^.info then
    { Element is the biggest element in the list so far, we don't have to change its position}
      begin
      aktuell:=ioRefListe;
      end
    else
        if aktuell^.info < vorgaenger^.info then
        {The number is smaller than the previous one, they

Open in new window

0
I had this question after viewing Pascal Helo.

i had this script
unit hospital;
interface

implementation
uses crt;
Var
name:string;
typeofroom,tp,tv,nory1,nory2:char;
month, day, year, daysstayed,roomcharge,tpcharge,tvcharge,totalcharge:integer;

const
pc=125;
sc=95;
Wc=75;
Tvc=3.50;
Tpc=1.75;
begin
//prompting
writeln('please enter the patients''s name':44);
readln(name);
writeln('please enter the number of days stayed in the hospital':63);
readln(daysstayed);
writeln('please write the month':31);
readln(month);
writeln('please write the day':29);
readln(day);
writeln('pelase enter the year':30);
readln(year);
writeln('please enter y or n for which typeofroom you used. P for private, S for semi private, and W for ward':57);
readln(typeofroom);
Case typeofroom of 'P':roomcharge:=(pc*daysstayed);
                   's':roomcharge:=(sc*daysstayed);
                   'w':roomcharge:=(wc*daysstayed);
end;
writeln('enter y or n for yes or no if they used the telephone':62);
readln(nory1);
Case nory1 of 'Y':tpcharge:=(tpc*daysstayed);
                 'N':tpcharge:=0;
end;

writeln('enter y or n for yes or no if they used the television':63);
readln(nory2);
Case nory2 of 'Y':tvcharge:=Tvc*daysstayed;
                 'N':tvcharge:=0;
end;
//computing
Totalcharge:=roomcharge+tvcharge+tpcharge;


end.
and the error Error: Incompatible types: got "S80REAL" expected "LONGINT"
2 times
plz help me fix it
thanx
0
And the image url f remote location is given in json response...how do i parse and display that in list view...parsing is done andvi cud display the text and details which s so fast over the network...but how do i retrieve the images and display it in list view imagelist appearence
0
Hello programming experts! I am having a memory problem that cannot explain root cause, please help me! The problem is as follows: My program throws exception when i exit. I investigated and thought that the cause of the error was the use Copymemory function to copy the record containing the variable have string data type.

Below is my demo program by delphi 2009: In my project,  I added 2 file project dpr then add sharedmemory for use BorlndMM.dll instead of using FastMM memory management. I define a struct containing a String variable. Allocate 1 array of 2048 PByte elements. Use Memory Copy function to copy 2 struct. finally, Free array 2048. when i exit program, my program threw exception.
type   
 TMyStructure = record
 F1: TMyStructure;

Open in new window

unit 1
procedure TForm9.FormCreate(Sender: TObject);
var
    i: Integer;
begin
    F1.str1 := 'This is a string to demo for copying the String data type 
                                            using the Copymemory method';
end;

Open in new window

unit 2
procedure TForm8.btn1Click(Sender: TObject);

var
Form9: TForm9;
i: Integer;
s1: array[0..2048-1] of PByte;
begin
    //  Alloc 1st 2048 segments, each segment gain 1KB
    for i := 0 to Length(s1) - 1 do
    begin

    s1[i] := AllocMem(1024);
end;

//  Create Form9
Form9 := TForm9.Create(Owner);

//  -> ERROR
CopyMemory(@Self.F1, @Form9.F1, SizeOf(TMyStructure));

//  -> OK
//  Self.F1 := Form9.F1;

// Free memory s1 array
for i := 0 to Length(s1) - 1 do
begin
    FreeMem(s1[i]);
end;
end;

Open in new window

0
Hi, I've been banging my head with trying to come up with a way on Pascal on how to create a function that saves an array of byte to file while keeping its integrity from the fist to the last byte.

I came up with two ideas, either I save the data to the file in its binary form or I convert the binary to hex then save.
When I need to load, if its hex I can decode and convert it to an array of bytes again.

I'm really stuck, because I looked over alot on the past days and didnt find anything remotely close to it. I've began recently working with Pascal so I'm not that experienced with it.
Going C++ would solve me issue but that is not an option here, I need to do it on Pascal.

So if anyone could come up with a way for me to save the array of bytes then load it again later on I would be really thankful.

I could also use a function to encode/decode the bytes, but i have no clue on how would that work.

This is the array I need to save

hmm: array [0..18954] of BYTE;

I have pretty much no base code cause everything I came up with brings error on the IDE, sorry.
0
I have big problem with StringList. I have text file with text like this:

     
51,179 km=Powiat Ostrzeszowski
    51,179 - 61,402 km=Powiat Wieruszowski
    61,402 - 64,559 km (d. DW450)=Powiat Wieruszowski
    64,559 km (d. DW450)=Powiat Kępiński 

Open in new window


I want to import this file and show first values, before "=" in RadioGroup. Second values after "=" i want to show on Label in moment when user clicks proper value on RadioGroup.

I would like to operate on Names and Values of StrongList.

Something like this: https://i.stack.imgur.com/dkLih.png

In *.pas file I have:

     
var
      Form1: TForm1;
      list: TStringList;
      i: Integer; 

Open in new window


On FormCreate:

   
 list := TStringList.Create;    
    list.LoadFromFile('dat\a1pik.dat');
    RadioGroup1.Visible := true;
    RadioGroup1.Items.Clear;

    for i := 0 to list.Count-1 do
        begin
            RadioGroup1.Items.Add(list.Names[i]);
        end;

And first values I have on RadioGroup. 

Open in new window


I try with RadioGroup like this:

     
procedure TForm1.RadioGroup1Click(Sender: TObject);
        begin
        Label.Caption := list.Values[list.Names[RadioGroup1.ItemIndex]];
        end; 

Open in new window


But doesn't work. What I do wrong?

P.S. Sorry for my English :)
0
Exploring SharePoint 2016
LVL 12
Exploring SharePoint 2016

Explore SharePoint 2016, the web-based, collaborative platform that integrates with Microsoft Office to provide intranets, secure document management, and collaboration so you can develop your online and offline capabilities.

Hello Guys I'm new with Delphi which uses pascal language.
I'm trying to create simple application which loaded all values in sMemo.Text. All Strings were working fine except with Boolean values "CheckBox and radio Buttons"
here is the line I'm using
sMemo1.Lines.Add(sCheckBox1.Create );
it gives me an error
[DCC Error] Unit1.pas(44): E2035 Not enough actual parameters.

here is my whole code

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, sCheckBox, sRadioButton, sGroupBox, sButton, sEdit, sMemo,
  sLabel;

type
  TForm1 = class(TForm)
    sMemo1: TsMemo;
    sEdit1: TsEdit;
    sEdit2: TsEdit;
    sEdit3: TsEdit;
    sButton1: TsButton;
    sButton2: TsButton;
    sGroupBox1: TsGroupBox;
    sRadioButton1: TsRadioButton;
    sRadioButton2: TsRadioButton;
    sCheckBox1: TsCheckBox;
    sMemo2: TsMemo;
    sLabel1: TsLabel;
    procedure sButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.sButton1Click(Sender: TObject);
begin
sMemo1.Clear;
sMemo1.Lines.Add(sEdit1.Text);
sMemo1.Lines.Add(sEdit2.Text);
sMemo1.Lines.Add(sEdit3.Text);
sMemo1.Lines.Add(sCheckBox1.Create);
end;
end.


Anyone here knows that. My main purpose with this app is to load all configuration into memo instead of an ini file wich is easy to …
0
i am using this function to find node in treeview

function TFORM1.lookingTreeView(name: String): PVirtualNode;
var
Node: PVirtualNode;
Data: PUserData;
begin
Result := nil;
Node := VDT1.GetFirst;
while ((Node <> nil) and (Result = nil)) do
begin
Data := VDT1.GetNodeData(Node);
if (Data.FObject.name= name) then
begin
Result := Node;
break;
end
else
Node := VDT1.GetNext(Node);
end;
end;

Open in new window


and i use it like so
Node := lookingTreeView(namedata);

if Node <> nil then
begin
// then stop execute the code 
exit;
end;
// if its nil then do execute the rest of code

Open in new window


so this code search for node in Vst and if the node exits stop the code execution and if does not exits do the rest  

but some times this function got bypassed i mean when a node is already exits the if statement of node <> nil does not detect that its not nil and continue executing the code.
0
Good day.

My aim to to design a form similar to the one in the attached image. My problem is that i would like to place forms all over the form but i am unable to do this bacuse my design time form is not as big as the run time maximised form. Is there any solution to this that will allow me to design my GUI using the enitire form, or atleast be able to place components properly on the form.
Screenshot--30-.png
0
How do I use idhttp to login to instagram also add functionality to like and follow ?
0
Hello,

I have different shortcuts in my program but I want to let the users change the shortcuts, just like in Notepad++ Shortcut mapper.

I like help in following:

- How to implement this in Delphi easily (attaching shortcuts to buttons and actions)
- Directions what is the best method to save and load the users shortcuts in/from database (each user of the same program would have separate shortcut settings).

Thank you in advance.
0
i have this code to insert some node inside Tvirtuailstringtree it works but some time strange behavior happened

this Tvirtuailstringtree  are inside a Tpanel called pnlmc

here is the code


function AddMCVDTMIC(AVST: TCustomVirtualStringTree; ANode: PVirtualNode; AObject: TUMICX): PVirtualNode;
    var
      Data: PUserONMIC;
    begin
      Result := AVST.AddChild(ANode);
      Data := AVST.GetNodeData(Result);
      AVST.ValidateNode(Result, false);
      Data^.FObject := AObject;
    end;

procedure Tform1.Talkin;
var
Node: PVirtualNode;
Data: PUserData;
UMICX : TUMICX;
begin
Node := lookingTreeView(LineToid);
Data := VDT1.GetNodeData(Node);
if (Node <> nil) then
begin
VDT1.IsVisible[Node] := False;
vstmca.BeginUpdate;
try
vstmca.Clear;
UMICX := TUMICX.Create;
try Data.FObject.istalking := '12'; except end;
umicx.Username :=  Data.FObject.Username;
umicx.userUid := Data.FObject.userUid;
umicx.istalking := Data.FObject.istalking;
umicx.color := Data.FObject.color;
umicx.image := Data.FObject.image;

try AddMCVDTMIC(vstmca, nil, umicx);  except end;

finally
  vstmca.EndUpdate;
end;
end;

//

if (recorder.Active = True) and (LineToid = IntToStr(UniqueID)) then
begin
try button1.Visible := false; except end;
try stop1.Visible := True; except end;
end
else if (recorder.Active = false) then // enrecorder check
begin
try button1.Enabled := false; except end;
try button1.Caption := 'streamin'; except end;
end;


try pnlmc.Height := Data.FObject.iHeigh; 

Open in new window

0
i have combobox that have items  like
1
2
3
4

i want to add items based on number so if last item = 4 then add new item with

5
6
7
8

and so on

function Tpnlsettings.findTheme(tName : string): Integer;
var
  I: Integer;
begin
  Result := -1;
  for I := 0 to cmbThemes.Items.Count - 1 do
  begin
    if cmbThemes.Items.Strings[i] = tName then
    begin
      Result := i;
      Break;
    end;
  end;
end;

procedure Tpnlsettings.btnAddThemeClick(Sender: TObject);
var
  I: Integer;
begin
  i := findTheme(intTostr(cmbThemes.items.Count));
  if i <> -1 then
  begin
    cmbThemes.ItemIndex := i;
  end else
  begin
    cmbThemes.Items.Add(intTostr(cmbThemes.items.Count+1));
    cmbThemes.ItemIndex := cmbThemes.items.Count-1;
  end;

  objectEnabled(btnThemeChange,True);
end;

Open in new window


current code fail to add with same approach i needed
0
i have two tvirtualstringtree in a form i wanted to invalidate them using timers

but i stuck with problems it seems that only 1 VST got invalidated and the other one ignored any idear why ?

i use invalidate with current code within timer

procedure Tform1.Timerval1Timer(Sender: TObject);
{$J+}
Const
iCount: Cardinal = 0;
{$J-}
begin
Inc(iCount);
if (iCount * TTimer(Sender).Interval) > 500 then
begin
xbool := NOT xbool;
iCount := 0;
end;
VDT1.Invalidate;
end;

procedure Tform1.Timerval2Timer(Sender: TObject);
{$J+}
Const
iCount: Cardinal = 0;
{$J-}
begin
Inc(iCount);
if (iCount * TTimer(Sender).Interval) > 500 then
begin
xbool := NOT xbool;
iCount := 0;
end;
VDT2.Invalidate;
end;

Open in new window


issue happens when i use beforecellpaint on each VSt

procedure Tform1.VDT1BeforeCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
var
Data: PUserdataon;
NewRect: TRect;
xOff, yOff: Integer;

begin
GradientFillCanvas(TargetCanvas, clred, clWhite, CellRect, gdHorizontal); // GraphUtil

if not Assigned(Node) then
begin
exit;
end;

Data := vdt1.GetNodeData(Node);

begin
NewRect := CellRect;
NewRect.Left := NewRect.Left + 2;
NewRect.Width := 24;
NewRect.Top := NewRect.Top;
NewRect.Bottom := NewRect.Bottom;
xOff := CellRect.Left + 70;
yOff := CellRect.Top +((30 - TargetCanvas.TextHeight('H')) div 2);
if xbool or (Data.FObject.bool= false) then

Open in new window

0
i have this code to grab node from vst

function form1.lookingTreeView(name: String): PVirtualNode;
var
Node: PVirtualNode;
Data: PUserData;
begin
Result := nil;
Node := VDT1.GetFirst;
while ((Node <> nil) and (Result = nil)) do
begin
Data := VDT1.GetNodeData(Node);
if (Data.FObject.userUid = name) then
begin
Result := Node;
break;
end
else
Node := VDT1.GetNext(Node);
end;
end;

Open in new window


and i use it like so

var
Node: PVirtualNode;
Data: PUserData;
begin
Node := lookingTreeView('123456');
Data := VDT1.GetNodeData(Node);

Open in new window


i want to add this node to another vst list after i find it

lets say my other vst list called VDT2

i want to add the node thet i find from VDT1 To VDT2 and hide it from VDT1

what should i do ?
0
CompTIA Security+
LVL 12
CompTIA Security+

Learn the essential functions of CompTIA Security+, which establishes the core knowledge required of any cybersecurity role and leads professionals into intermediate-level cybersecurity jobs.

in my previous question i asked for the same question that i am asking now

https://www.experts-exchange.com/questions/28943546/how-do-i-use-on-compare-node-correctly-in-TVirtualStringTree.html

thats my old question. sadly answers did not solve the main issue i have

here is the current code

procedure Tform1.VDT1CompareNodes(Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
var
Data1, Data2: PUserData;
begin
Data1 := VDT1.GetNodeData(Node1);
Data2 := VDT1.GetNodeData(Node2);

      if (not Assigned(Data1)) or (not Assigned(Data2)) then
      begin //
        Result := 0;
        exit;
      end;


      //hand check  less than

      if (Data1.FObject.Userhand < Data2.FObject.Userhand) and (istalkon=True) then
      begin
        Result := -1;
        memo1.Lines.Add('is old date');
      end
      else
      if (Data1.FObject.Userhand < Data2.FObject.Userhand) and (istalkon=False) then
      begin
      Result := 1;
      end else

       // hand check greater than
      if (Data1.FObject.Userhand > Data2.FObject.Userhand) and (istalkon=True) then
      begin
        Result := -1;
        memo1.Lines.Add('is New date');
      end
      else
      if (Data1.FObject.Userhand > Data2.FObject.Userhand) and (istalkon=False) then
      begin
      Result := 1;
      end else

      //hand check  less than

      if (Data2.FObject.Userhand < Data1.FObject.Userhand) and (istalkon=True) then
      begin
        Result

Open in new window

0
i am using following code to send text data that saved inside memory stream
MS := TMemoryStream(OutboundCmds.Objects[I]);
        if MS <> nil then
        begin
          AContext.Connection.IOHandler.LargeStream := true;
          AContext.Connection.IOHandler.Write(MS, 0, true);
        end;
      end;

Open in new window


its sends text data correctly if its in english

but if its in other language like arabic it comes questions marks like this "?????" what could be the issue ?

here is how i add text to memory stream

procedure TConnection.sendData;
var
  I: integer;
  SL: TStringList;
  MS: TMemoryStream;
begin
  MS := TMemoryStream.Create;
  try
      SL := TStringList.Create;
      try
    begin
        SL.Add('مرحبا');
      end;

       if (SL.Count > 0) then
        begin
          SL.SaveToStream(MS);
          MS.Position := 0;
        end;
      finally
        SL.Free;
      end;
  finally
    MS.Free;
  end;

end;

Open in new window

0
I am using Threads programming for the first time.
Can use the below mentioned Private variable 'sysAbort' as done below ?
Can I use sysNum Local Variable as done below ?
(I will be running only one instance of the thread at a time)


  private
    { Private declarations }
    sysAbort:Boolean ;

procedure TForm3.button_StartClick(Sender: TObject);
var
  sysNum:Integer ;
begin
  sysAbort:=False ;
  sysNum:=0 ;
  memo1.lines.add('Starting') ;
  with TThread.CreateAnonymousThread(
    procedure
    var
      MaxValue:Int64 ;
      I: Integer;
      Total: Integer;
    begin
      MaxValue:=1000 ;
      for I := 1 to MaxValue do
      begin
        if sysAbort then  // Can I use thus ?
          break ;
        sysNum:=I ;  // Can I use local variable
        // memo1.lines.Add('Violated  ' + Inttostr(sysNum)) ;  // This works too !
        if (I * 10 mod MaxValue) = 0 then
          TThread.Synchronize (TThread.CurrentThread,
            procedure ()
            begin
              memo1.lines.Add('Progress : ' + Inttostr(I)) ;
            end);

        sleep(10) ;   // just for delay
      end;

      TThread.Synchronize (TThread.CurrentThread,
        procedure ()
        begin
          memo1.lines.Add('End of process : ' + IntToStr(sysNum));
        end);
    end

  ) do
  begin
    OnTerminate := ThreadFinished ;
    Start;
  end;
end;

procedure TForm3.ThreadFinished(Sender: TObject);
begin
  if TThread(Sender).FatalException = nil then begin
    

Open in new window

1
i have this function that detect fast click

  function IsFlood:Boolean;
  var
  i, x : integer;
  begin
    Result := False;
    i := trunc(GetTickCount/2);
    x := trunc((i - LastFloodTime)/4);
    Result := False;
    if x < 180 then Result := True;
    LastFloodTime := i;
  end;

Open in new window


this function uses GetTickCount i want to use Tstopwatch instead any one can convert this function to Tstopwatch ?
1
i have this idhttp code that download images to memory stream and save it on disk

i want to convert jpeg images and png to GIF then save them to disk

if (itsimage = 'image/jpeg') or (itsimage = 'image/png') or (itsimage = 'image/gif') then
begin
try
aIdHttp.Get(trim(FURL), aMs);
except
end;
aMs.SaveToFile(path);
end;

try
if aIdHttp.Connected then
aIdHttp.Disconnect;

except // do not care about any errors yet, maybe log them later

end;

Open in new window

1
You can tell I'm a newbie. But everyhthing I've read tells me this should work.

unit AdvertisingAnalysisU;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, pngimage, StdCtrls, jpeg, ExtCtrls, ComCtrls;

type
  TForm19 = class(TForm)
    Button1: TButton;
    Procedure GetAdvertisingSpend;


     private
    { Private declarations }

  public
    { Public declarations }

  end;

var
  Form19: TForm19;

implementation

{$R *.dfm}

Procedure GetAdvertisingSpend;
var a: integer;
begin
  a:=1;
end;
end.


So I get the message unsatisfied forward or external declaration on the GetAdvertisingSpend procedure.
1

Pascal

Pascal is an influential imperative and procedural programming language, largely (but not exclusively) intended to teach students structured programming and data structuring. Pasca was implemented on a wide range of architectures, from early PCs to mainframes. Pascal derivatives include OOP-based Object Pascal (used in Delphi and Lazarus/Free Pascal). Pascal is a purely procedural language and includes control statements with reserved words, but has many data structuring facilities and other abstractions like type definitions, records, pointers, enumerations, and sets.

Top Experts In
Pascal
<
Monthly
>

No Top Experts for this time period. Answer questions to earn the title!