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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2010, 15:17   #1
Serebah
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 44
По умолчанию Работа с ListBox и Edit и динамической памятью

У меня на форме есть ListBox1, Edit1, Edit2, и кнопка Button1. Я хочу чтоб при вводе информации в Edit1, Edit2 и нажатии кнопки отображалась информация в ListBox1 только та, что введена в Edit1, но при этом при выборе этой информации из ListBox1 возвращалась информация и в Edit1 и в Edit2.
Вобщем, если я ввожу в Edit1 фамилию а в Edit2 год рождения, то в ListBox1 отображается только фамилия, но при выборе фамилии из ListBox1 я могу увидеть год рождения в Edit2 и фамилию в Edit1.
Все данные должны храниться в динамической памяти и при закрытии программы удаляться.
Помогите пожайлуста.
Serebah вне форума Ответить с цитированием
Старый 16.11.2010, 15:58   #2
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Код:
type
  TMyClass = class
    DR : string;
  end;

procedure TForm1.Button1Click(Sender: TObject); //событие OnClick кнопки
var
  MC : TMyClass;
begin
  MC := TMyClass.Create;
  MC.DR := Edit2.Text;
  ListBox1.Items.AddObject(Edit1.Text, MC);
end;

procedure TForm1.ListBox1Click(Sender: TObject); //событие OnClick ListBox'а
begin
  if ListBox1.ItemIndex >= 0 then begin
    Edit1.Text := ListBox1.Items[ListBox1.ItemIndex];
    Edit2.Text := TMyClass(ListBox1.Items.Objects[ListBox1.ItemIndex]).DR;
  end;
end;
Скандербег вне форума Ответить с цитированием
Старый 16.11.2010, 16:15   #3
Serebah
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 44
По умолчанию

Спасибо огромное!
Serebah вне форума Ответить с цитированием
Старый 19.11.2010, 12:29   #4
Serebah
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 44
По умолчанию

Подскажите еще кто знает, как сделать для кнопки 2 "изменить" чтоб изменялись уже введенные данные чтоб не вносить новую запись!
Serebah вне форума Ответить с цитированием
Старый 19.11.2010, 13:01   #5
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Почти так же, только объект не надо создавать, а взять тот который сохранен в Items:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  MC : TMyClass;
begin
  if ListBox1.ItemIndex >= 0 then begin
    MC := TMyClass(ListBox1.Items.Objects[ListBox1.ItemIndex]);
    MC.DR := Edit2.Text;
    ListBox1.Items[ListBox1.ItemIndex] := Edit1.Text;
  end;
end;
Скандербег вне форума Ответить с цитированием
Старый 19.11.2010, 13:41   #6
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Дополнительный класс не нужен.
Вот так получше:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    Button2: TButton;
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure ListBox1DblClick(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    N :Integer;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 ListBox1.Style := lbOwnerDrawFixed;
 ListBox1.ShowHint := True;
 ListBox1.Hint := 'Двойной клик мышью по нужному элементу списка, для выбора';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if (Trim(Edit1.Text)='') or (Trim(Edit2.Text)='') then
  Exit;
 ListBox1.Items.Values[Edit1.Text] := Edit2.Text;
 Edit1.Clear;
 Edit2.Clear;
end;

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
 With (Control as TListBox) DO
 Begin
    // выделенное
  If (odSelected in State) then
   Canvas.Brush.Color := $00EFD3C6
  else
   Canvas.Brush.Color := clWhite;
  Canvas.FillRect(Rect);
   // текст
  Canvas.TextOut(Rect.Left, Rect.Top, Items.Names[Index]);
 end;
end;

procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
 N := ListBox1.ItemIndex;
 if ListBox1.Items.Count > 0 then
 if N >= 0 then
 begin
  Edit1.Text := ListBox1.Items.Names[N];
  Edit2.Text := ListBox1.Items.ValueFromIndex[N];
 end;  
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 if ListBox1.Items.Count > 0 then
 if N >= 0 then
 begin
  ListBox1.Items.Strings[N] := Format('%s=%s', [Edit1.Text, Edit2.Text]);
 end;  
end;

end.
Вложения
Тип файла: rar ListBox Edit1 Edit2.rar (6.9 Кб, 9 просмотров)
Alter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с памятью GrihaI Общие вопросы C/C++ 0 14.05.2010 18:18
Работа с памятью getUp Общие вопросы C/C++ 6 19.01.2010 01:11
Помогите пожалуйста с динамической памятью и указателями Riddick2013 Помощь студентам 1 19.12.2007 14:41
Работа с памятью Shurik Hacker Общие вопросы Delphi 7 22.06.2007 20:51