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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.03.2013, 18:10
Igor22 Igor22 вне форума
Прохожий
 
Регистрация: 28.03.2013
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Удаление из массива по названию элемента

Добрый день,
у меня такая проблема есть программа написанная по принципам ооп(структура динамическая очередь упорядоченных массивов) в ней есть 3 класса(1 "стринговый" класс с 2 свойствами,2 класс на базе массива с 1св. и 3 на базе очереди тоже с 1 свт.)- собственно сама проблема:не совсем понимаю как правильно реализовать поиск и удаление элемента по названию из массива (не по индексу,название естественно string'вое)

Вот проблемный кусок кода(если надо могу выложить весь код класса массива)
Код:
function TSection.FindNews(_NewsName: string):string;
var
 i:byte;
begin
  for i:=1 to GetCount do
    if NewsArray[i].GetTitleName = _NewsName Then
    begin
      Result :=i;
      Exit;
    end;
  Result := 0;
end;


function TSection.DeleteNews(_NewsName:string): boolean;    
var
  i,tmp: Byte;
begin
  Result := False;
  if count <> 0 then
  begin
    tmp := FindNews(_NewsName:string);
    if tmp <> 0 then 
    begin    
      for i:=tmp to Count-1 do NewsArray[i] := NewsArray[i+1];
      NewsArray[Count] := nil;
      Dec(Count);     
      Result := True;
    end;
  end;
 end;
Ответить с цитированием
  #2  
Старый 28.03.2013, 18:13
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Код:
NewsArray 
какого типа?
Ответить с цитированием
  #3  
Старый 28.03.2013, 20:36
Igor22 Igor22 вне форума
Прохожий
 
Регистрация: 28.03.2013
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

NewsArray:string; массив строк по сути
Код:
const
  MaxNews = 10;

type
  MyArray = array [1..MaxNews] of TNews;


закладываются подозрения что преподаватель явно что то напутал,так как везде удаление по индексу (нашел удаление по названию только в списке TStrList)
Ответить с цитированием
  #4  
Старый 28.03.2013, 20:51
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Нет ли смысла перестроить NewsArray в TStringList.

И пользоваться адекватным удалением. Если TNews это стринг.
Или использовать <TNews>List generic collection.
Ответить с цитированием
  #5  
Старый 28.03.2013, 21:38
Igor22 Igor22 вне форума
Прохожий
 
Регистрация: 28.03.2013
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Если перестрою NewsArray в TStringList это уже будет список.
Удаление по названию в списке я понимаю(даже нашел примеры) ,но как это реализовать в массиве....
Ответить с цитированием
  #6  
Старый 28.03.2013, 22:00
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Если перестрою NewsArray в TStringList это уже будет список.
Когда-то копал всякие List'ы делфовские. Ни разу они не списки. Обычные динамические массивы.
Отрывок из Classes.pas:
Код:
...
  TStringItem = record
    FString: string;
    FObject: TObject;
  end;

  PStringItemList = ^TStringItemList;
  TStringItemList = array of TStringItem; // Обычный массив
  TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;

  TStringList = class(TStrings)
  private
    FList: TStringItemList; // тут он и используется
...
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #7  
Старый 28.03.2013, 23:21
Igor22 Igor22 вне форума
Прохожий
 
Регистрация: 28.03.2013
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

вот что получилось(реализация класса неполная):
interface
Код:
uses
  News,SysUtils;

const
  MaxNews = 10;

type
  TStringItemList = array [1..MaxNews] of TNews;

TSection=class 
  public  
    constructor Create(_SectionName:string;_NewsName:string);
    function DeleteNews(_NewsName: string): boolean;
    function FindNews(_NewsName: string): string;
  private      
    NewsList:TStringItemList;
    SectionName: String; 
    NextSection: TSection;
    Count: Integer; 
end;


implementation

constructor TSection.Create;
begin
  NextSection := nil;
  Count := 0;
end;



function TSection.FindNews(_NewsName: string):string;
var
 i:byte;
begin
  for i:=1 to GetCount do
    if NewsList[i].GetTitleName = _NewsName Then
    begin
      Result :=i;
      Exit;
    end;
  Result := 0;
end;

function TSection.DeleteNews(_NewsName:string): boolean;       
var
  i: Byte;
  Lst:TStringItemList;
begin
  Result := False;
  if count <> 0 then
  begin
    Lst := FindNews(_NewsName:string);
    if Lst:=NewsName then
    begin
      for i:=Lst[index] to Count-1 do NewsList[i] := NewsList[i+1];
      NewsList[Count] := nil;
      Dec(Count);      
      Result := True;
    end;
  end;
 end;

//если есть ошибки исправьте если несложно,заранее спасибо
Ответить с цитированием
  #8  
Старый 29.03.2013, 01:07
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Вы вот мне скажите, у вас без ошибок сия функция компилится и выполняется?
Код:
function TSection.FindNews(_NewsName: string):string;
var
 i:byte;
begin
  for i:=1 to GetCount do
    if NewsList[i].GetTitleName = _NewsName Then
    begin
      Result :=i;
      Exit;
    end;
  Result := 0;
end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #9  
Старый 29.03.2013, 01:28
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ну нафига из класса делать список? Вам уже указали на StringList, вы же опять огород городите.
Код:
  TSection=class   
  public    
    constructor Create(_SectionName:string;_NewsName:string);
    function DeleteNews(_NewsName: string): boolean;
    function FindNews(_NewsName: string): string;
  private
    NewsList:TStringItemList;
    SectionName: String;
    NextSection: TSection; // ???
    Count: Integer;
  end;   
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #10  
Старый 29.03.2013, 20:52
Igor22 Igor22 вне форума
Прохожий
 
Регистрация: 28.03.2013
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Извините из за болезни сильно туплю,сейчас исправлю
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter