dll i listview

0

Napisałem sobie bibliotekę, aby ułatwić sobie zycie i nie wklejać tych samych procedur do kazdego programu gdzie używam listview, napisałem naciskam f9 i nic tylko kilkanaście błędów
<font size="1">[Error] sllistview.dpr(9): '=' expected but ':' found
[Error] sllistview.dpr(13): Statement expected but 'PROCEDURE' found
[Error] sllistview.dpr(46): Undeclared identifier: 'Items'
[Error] sllistview.dpr(50): 'DO' expected but identifier 'Add' found
[Error] sllistview.dpr(56): Undeclared identifier: 'ImageIndex'
[Error] sllistview.dpr(63): Undeclared identifier: 'Caption'
[Error] sllistview.dpr(75): Missing operator or semicolon
[Error] sllistview.dpr(107): Undeclared identifier: 'Items'
[Error] sllistview.dpr(114): 'THEN' expected but identifier 'Count' found
[Error] sllistview.dpr(121): Undeclared identifier: 'SubItems'
[Error] sllistview.dpr(139): 'DO' expected but identifier 'Count' found
[Error] sllistview.dpr(160): ',' or ';' expected but '(' found
[Error] sllistview.dpr(160): Declaration expected but identifier 'sFileName' found
</span>

A tak wyglada kod, zastanawiam sie jakich modułów musze użyć, ablo co jeszcze zadeklarować

library sllistview;

uses
  SysUtils,  Classes;

  type
  ListView: TListView;
{$R *.res}

begin
procedure wczytywanie(AListView: TListView; sFileName: string);stdcall;
var
  F: TFileStream;
  IdxItem, IdxSubItem, IdxImage: Integer;
  W, ItemCount, SubCount: Word;
  pText: PChar;
  PTemp: PChar;
  MySignature: array [0..2] of Char;
  sExeName: string;
begin
  with AListView do
  begin
    ItemCount := 0;
    SubCount  := 0;

    sExeName := ExtractFileName(sFileName);

    if not FileExists(sFileName) then
    begin
//      MessageBox(Handle, PChar(Format(Msg1, [sExeName])), 'I/O Error', MB_ICONERROR);
      Exit;
    end;

    F := TFileStream.Create(sFileName, fmOpenRead);
    F.Read(MySignature, SizeOf(MySignature));

    if MySignature <> 'LVF' then
    begin
     // MessageBox(Handle, PChar(Format(Msg2, [sExeName])), 'I/O Error', MB_ICONERROR);
      Exit;
    end;

    F.Read(ItemCount, SizeOf(ItemCount));
    Items.Clear;

    for idxItem := 1 to ItemCount do
    begin
      with Items.Add do
      begin
        //Read imageindex
        F.Read(SubCount, SizeOf(SubCount));
        //Read imageindex
        F.Read(IdxImage, SizeOf(IdxImage));
        ImageIndex := IdxImage;
        //Read the Caption
        F.Read(w, SizeOf(w));
        pText := StrAlloc(w + 1);
        pTemp := StrAlloc(w + 1);
        F.Read(pTemp^, W);
        StrLCopy(pText, pTemp, W);
        Caption := StrPas(pText);
        StrDispose(pTemp);
        StrDispose(pText);
        if SubCount > 0 then
        begin
          for idxSubItem := 1 to SubCount do
          begin
            F.Read(w, SizeOf(w));
            pText := StrAlloc(w + 1);
            pTemp := StrAlloc(w + 1);
            F.Read(pTemp^, W);
            StrLCopy(pText, pTemp, W);
            Items[idxItem - 1].SubItems.Add(StrPas(pText));
            StrDispose(pTemp);
            StrDispose(pText);
          end;
        end;
      end;
    end;

    F.Free;
  end;
end;

procedure zapisywanie(AListView: TListView; sFileName: string);stdcall;
var
  idxItem, idxSub, IdxImage: Integer;
  F: TFileStream;
  pText: PChar;
  sText: string;
  W, ItemCount, SubCount: Word;
  MySignature: array [0..2] of Char;
begin
  //Initialization
  with AListView do
  begin
    ItemCount := 0;
    SubCount  := 0;
    //****
    MySignature := 'LVF';
    //  ListViewFile
    F := TFileStream.Create(sFileName, fmCreate or fmOpenWrite);
    F.Write(MySignature, SizeOf(MySignature));

    if Items.Count = 0 then
      // List is empty
      ItemCount := 0
    else
      ItemCount := Items.Count;
    F.Write(ItemCount, SizeOf(ItemCount));

    if Items.Count > 0 then
    begin
      for idxItem := 1 to ItemCount do
      begin
        with Items[idxItem - 1] do
        begin
          //Save subitems count
          if SubItems.Count = 0 then
            SubCount := 0
          else
            SubCount := Subitems.Count;
          F.Write(SubCount, SizeOf(SubCount));
          //Save ImageIndex
          IdxImage := ImageIndex;
          F.Write(IdxImage, SizeOf(IdxImage));
          //Save Caption
          sText := Caption;
          w     := Length(sText);
          pText := StrAlloc(Length(sText) + 1);
          StrPLCopy(pText, sText, Length(sText));
          F.Write(w, SizeOf(w));
          F.Write(pText^, w);
          StrDispose(pText);
          if SubCount > 0 then
          begin
            for idxSub := 0 to SubItems.Count - 1 do
            begin
              //Save Item's subitems
              sText := SubItems[idxSub];
              w     := Length(sText);
              pText := StrAlloc(Length(sText) + 1);
              StrPLCopy(pText, sText, Length(sText));
              F.Write(w, SizeOf(w));
              F.Write(pText^, w);
              StrDispose(pText);
            end;
          end;
        end;
      end;
    end;
    F.Free;
  end;
end;

exports
{ tutaj natomiast eksportujemy same procedury }
  zapisywanie(AListView: TListView; sFileName: string) name 'Zapisz',
wczytywanie(AListView: TListView; sFileName: string) name 'Wczytaj';


end.
0

Nie mam uruchomionego Delphi, więc piszę z głowy i mogą być błędy (ale ja mam talent, nie? :) ).

  1. Sekcja type. Tam jest 1 błąd. Jeśli chciałeś zadeklarować zmieną typu TListView, to zamiast type wstaw var. Oto prawidłowy kod:
var
  ListView: TListView;

Zaraz wystąpi drugi błąd - trzeba będzie dodać do listy modułów (uses) moduł, w którym jest deklaracja klasy TListView. Nie pamiętam, który to był moduł, więc najpierw dodaj pierwszy i spróbuj skompilować. Jak będzie błąd w stylu 'Undeclared identifier: TListView' czy coś takiego, usuń wpisany moduł a wpisz następny. Oto moduły, w których może być deklaracja klasy TListView: StdCtrls, ExtCtrls, ComCtrls, CommCtrls. Jakby nie chodziło, wstaw na formularz komponent klasy TListView, skompiluj i sprawdź, jaki moduł wstawiło Ci Delphi do listy uses formularza :).

  1. To jest blok begin-end zawierający operacje wykonywane przez DLL zaraz po załadowaniu. Wszystkie procedury/funkcje powinieneś deklarować przed tym słowem begin:
// deklaracje procedur/funkcji
begin
// operacje wykonywane zaraz po załadowaniu
end.

3 i dalej Na moje oko powinno chodzić :) (chociaż rozumiem te komunikaty nie chwaląc się :) ).

Zacznij od przeniesienia tych procedur przed begin i usunięciu tego błędu z deklaracją (nr 1). Potem może pójdzie. Jak nie, to pisz :). Mam nadzieję, że coś pomogłem i że coś z tego zrozumieliście :)

0
  1. Do uses dodaj ComCtrls.
  2. Deklarację zmiennej ListView możesz wywalić bo i tak jej nie używasz.
  3. Tak jak wyżej napisał brodny w punkcie 2 :) przenieś deklaracje procedur nad begin
  4. Eksportuj procedury w następujący sposób:
exports
{ tutaj natomiast eksportujemy same procedury }
  zapisywanie index 1 name 'Zapisz',
  wczytywanie index 2 name 'Wczytaj';
  1. http://4programmers.net/article.php?id=30
0
  1. exportuj procedury w następujący sposób:
exports
{ tutaj natomiast eksportujemy same procedury }
  zapisywanie index 1 name 'Zapisz',
  wczytywanie index 2 name 'Wczytaj';

Eksport przez indeks nie jest wymagany, wygodniej jest eksportować przez nazwę. Ale jeśli ktoś się uprze, to proszę bardzo. Żeby było kompletnie, eksportowanie przez indeks jest efektywniejsze niż przez nazwę.

0

Niestety to jakoś mi nie działa dll storzył ale wywala mi takie coś
"Cannot debug project unless a host application is defined. Use the run parameters....dialog box

i jeszcze jedno jak eksportuje procedury w 5taki sposób to mam tylko kominikat jw
zapisywanie name 'Zapisz',
wczytywanie name 'Wczytaj';

natomiast jak zrobie to tak
zapisywanie index 1 name 'Zapisz',
wczytywanie index 2 name 'Wczytaj';
to mam jeszcze coś takiego
[Warning] sllistview.dpr(159): Symbol 'INDEX' is specific to a platform
[Warning] sllistview.dpr(160): Symbol 'INDEX' is specific to a platform

przy okazji jak by się komuś chciało niech zajrzy tu
http://4programmers.net/Forum/viewtopic.php?id=56039

0

Niestety to jakoś mi nie działa dll storzył ale wywala mi takie coś
"Cannot debug project unless a host application is defined. Use the run parameters....dialog box

Bo zapewne dales run a dlla nie da sie uruchomic, przynajmniej nie w pelni tego slowa znaczeniu.

0

no cóż, nie możesz uruchomić samej biblioteki - potrzebujesz jeszcze program, który z tej biblioteki skorzysta.

0

no cóż, nie możesz uruchomić samej biblioteki - potrzebujesz jeszcze program, który z tej biblioteki skorzysta.

no dobra a co z tym
[Warning] sllistview.dpr(159): Symbol 'INDEX' is specific to a platform
[Warning] sllistview.dpr(160): Symbol 'INDEX' is specific to a platform

0

no cóż, nie możesz uruchomić samej biblioteki - potrzebujesz jeszcze program, który z tej biblioteki skorzysta.

no dobra a co z tym
[Warning] sllistview.dpr(159): Symbol 'INDEX' is specific to a platform
[Warning] sllistview.dpr(160): Symbol 'INDEX' is specific to a platform

Ostrzeżenie, że eksportowanie przez indeks jest zależne od konretnej platformy systemowej. Widocznie w Linuxie (Kylix) można eksportować tylko przez nazwę (ale nie jestem pewien, nie miałem styczności z Linuxem ani tym bardziej z Kylixem, więc mogę się mylić). Możesz zrezygnować z generowania ostrzeżeń poprzez wyłączenie dyrektywy kompilatora $WARNINGS:

{$WARNINGS Off}

a potem, gdzie ostrzeżenia mogą się przydać, włączyć je z powrotem:

{$WARNINGS On}

1 użytkowników online, w tym zalogowanych: 0, gości: 1