Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.03.2010, 00:51
Nostalgia Nostalgia вне форума
Прохожий
 
Регистрация: 29.12.2008
Сообщения: 15
Репутация: 10
По умолчанию Стэк. прорисовка в Memo

Доброго времени суток,
подскажите пожалуйста как в приведенном коде сделать, чтобы стэк сразу добавлялся в Memo, а не считывался с Edit. Нужно сделать прорисовку. И ещё как задать максимальное количество символов в строке в мемо - 10 ? вообще как оно задается ? или нужно писать отдельную процедуру ? Я новичёк в этом деле, подскажите пожалуйста на доступном языке что мне исправить.
Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, stack2, StdCtrls;
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Memo1: TMemo;
    Label4: TLabel;
    Button1: TButton;
    Button4: TButton;
    Label2: TLabel;
    Button3: TButton;

    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  stack:tstack;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
begin
if edit1.text<>'' then
if length(edit1.text)=10  then
begin
s:=edit1.Text;
memo1.Lines.Add(s);
stack.AddToStack(s);
edit1.Text:=''
end
else
showmessage('Длина строки меньше 10')
else
showmessage('Введите значение');
end;

procedure TForm1.Button3Click(Sender: TObject);
var n:integer;
begin
if not stack.EmptyStack then
begin
stack.LastOfStack;
stack.DelFromStack;
n:=memo1.Lines.Count;
memo1.Lines.Delete(n-1);
end
else
showmessage('Стек пуст');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
stack:=tstack.Create;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
stack.Free;
form1.Close;
end;

end.

unit Stack2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
     const
        StackEmpty =nil;
     type
        T = string;
        TStackEl=^Stackel;
        StackEl=record
                el:T;
                prev:TStackEl;
                end;
     TStack = class
   private
     StackTop:TStackEl;

   public
     Constructor Create;                      //конструктор
     Function EmptyStack:boolean;   //перевірка, чи порожній стек
     Procedure AddToStack(elem:T); //додавання елементу до стека
     Procedure DelFromStack;           //видалення елементу зі стека
     Function LastOfStack:T;             //останній елемент стеку
   end;

implementation
     Constructor TStack.Create;
     begin
       Inherited Create
     end;

     Function TStack.EmptyStack;
     begin
       EmptyStack:=StackTop = StackEmpty
     end;
     procedure TStack.AddtoStack;
     var
        tmp:TStackEl;
     begin
        new(tmp);
        tmp^.el:=elem;
        tmp^.prev:=STackTop;
        STackTop:=tmp;
     end;
     
     procedure TStack.DelFromStack;
     var
        help:TStackEl;
     begin
        if StackTop<>STackEmpty then
        begin
                help:=StackTop;
                StackTop:=StackTop^.prev;
                dispose(help);
        end
        else
        showmessage('error stack pust');
     end;
     function TStack.LastOfStack;
        begin
                if StackTop<>StackEmpty then
                result:=StackTop^.el;

        end;
end.
   	
Ответить с цитированием
  #2  
Старый 20.03.2010, 02:01
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

а тебе обязательно стек реализовывпть именно как запись с указателем? Просто для строкового стека удобнее работать с TStringList, обернув его в свой класс.

Код:
type
  TStringStack = class
  private
    FStorage : TStringList;
  public
    constructor Create;
    destructor Destroy; override;

    procedure Posh(S : String);
    function Pop : String;
    function IsEmpty : Boolean;

    procedure AssignToMemo(AMemo : TMemo);
  end;

implementation

procedure TStringStack.Push(S : String);
begin
  If Length(S) < 10 Then Raise Exception.Create('String too short');
  Fstorage.Insert(0,S);  // Кажется так.
end;

function TStringStack.Pop : String;
begin
  If IsEmpty Then Raise Exception.Create('Stack is empty');
  Result := FStorage[0];
  FStorage.Delete(0);
end;

function TStringStack.IsEmpty : Boolean;
begin
  Result := FStorage.Count = 0;
end;

constrictor TStringStack.Create;
begin
  inherited;
  FStorage := TStringList.Create;
end;

destructor TStringStack.Destroy;
begin
  FStorage.Free;
  inherited;
end;

procedure TStringStack.AssignToMemo(AMemo : TMemo);
begin
  AMemo.Lines.Assign(FStorage As TStrings);
end;

В приведенном примере метод AssignToMemo копирует содержимое стека в Memo.
Ответить с цитированием
  #3  
Старый 20.03.2010, 12:06
Nostalgia Nostalgia вне форума
Прохожий
 
Регистрация: 29.12.2008
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
а тебе обязательно стек реализовывпть именно как запись с указателем?
да, обязательно
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:51.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025