Hilfe bei Kylix3 Anwendung Hilfe !!

Hallo

Also das mit der Einfachen Textdatei war wohl irgend ein kopierfehler denn als ich den
Ordner noch mal Kopiert habe und Knoppix auf dem Zielsystem gebootet habe ist die
Ausführbare Datei immer noch da gewesen na ja keine Ahnung warum es beim ersten
mal nicht geklappt hat.

Hab unter dem Entwicklungssystem mal deinen Befehl

"ls -l Videoproject "

eingegeben und folgende ausgabe bekommen:

-rwxr-xr-x 1 root root 2646420 2007-08-31 7:29 Videoproject

Vorher hab ich die Datei mit dem Befehl

"strip Videoproject "

auf 2,5MB verkleinert. Doch als ich dann die Ausführbare Datei auf dem Zielsystem
starten wollte ging es immer noch nicht und habe folgende Fehlermeldung bekommen:

./Videoproject:error while loading shared libraries: libgdk_pixbuf.so.2: cannnot open sharec object file: No such file or directory

was muß ich tun? Muß ich da doch noch ne Library linken wenn ja wie?

Ich hab ein Timage Object benutzt hier der Anfangscode meiner VideoUnit danach
kommen nur noch proceduren der verschiedenen Buttons.

PHP:
unit VideoUnit;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Buttons,
  StdCtrls, ExtCtrls;

type

  { TVideoForm }

  TVideoForm = class(TForm)
    LeftButton: TSpeedButton;
    SplitImage1: TImage;
    SplitImage: TImage;
    MasterImage: TImage;
    StatusLabel: TLabel;
    ZoomButton1: TSpeedButton;
    ZoomButton2: TSpeedButton;
    IrisButton1: TSpeedButton;
    IrisButton2: TSpeedButton;
    FocusButton1: TSpeedButton;
    FocusButton2: TSpeedButton;
    UpButton: TSpeedButton;
    DownButton: TSpeedButton;
    RightButton: TSpeedButton;
    TotalzoomButton: TSpeedButton;
    WeitwinkelButton: TSpeedButton;
    ScanYButton: TSpeedButton;
    ScanXButton: TSpeedButton;
    HoldButton: TSpeedButton;
    SplitscreenButton: TSpeedButton;
    WartungsButton: TSpeedButton;
    ZahnradButton: TSpeedButton;
    StepsButton: TSpeedButton;


    procedure ZoomButton1Click(Sender: TObject);
    procedure SplitscreenButtonClick(Sender: TObject);
    procedure WartungsButtonClick(Sender: TObject);
    procedure StepsButtonClick(Sender: TObject);
    procedure ZoomButton2Click(Sender: TObject);
    procedure IrisButton1Click(Sender: TObject);
    procedure IrisButton2Click(Sender: TObject);
    procedure FocusButton1Click(Sender: TObject);
    procedure FocusButton2Click(Sender: TObject);
    procedure WeitwinkelButtonClick(Sender: TObject);
    procedure TotalzoomButtonClick(Sender: TObject);
    procedure UpButtonClick(Sender: TObject);
    procedure DownButtonClick(Sender: TObject);
    procedure LeftButtonClick(Sender: TObject);
    procedure RightButtonClick(Sender: TObject);
    procedure ZahnradButtonClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure HoldButtonClick(Sender: TObject);
    procedure ScanXButtonClick(Sender: TObject);
    procedure ScanYButtonClick(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
      
   private
    { private declarations }
  public
    { public declarations }
  end; 

var
  VideoForm: TVideoForm;

implementation

{ TVideoForm }

var p,h,t,m,s,z,i,f,b,e,bereich:Byte;
    estr,zstr,istr,fstr,bstr:String;

procedure TVideoForm.SplitscreenButtonClick(Sender: TObject);
begin
     p:=p+1;
     if (StepsButton.Visible) then StepsButtonClick(Sender);
     if (ZahnradButton.Visible) then ZahnradButtonClick(Sender);
     if  p=2 then
      begin
        StatusLabel.Caption:='Splitscreen Funktion';
        SplitscreenButton.Visible:=true;
        SplitImage1.Show;
        p:=0;
      end
     else
      begin
        StatusLabel.Caption:='';
        SplitscreenButton.Visible:=false;
        SplitImage1.Hide;

      end;
end;
 
Also:
1. Du hast jede Menge Images in Deiner Form, die so vermute ich mal, recht groß sind. Daher kommt dann auch die Dateigröße. Hier solltest Du vielleicht überlegen, ob Du diese dynamisch also nur dann anlegst, wenn Du sie benötigst. Zweite Frage ist eigentlich benötigst Du immer das TImage-Objekt oder brauchst Du die Objekte eigentlich nur um mal ein paar Images zwischen zu speichern. Wenn es letzeres ist, dann benutze lieber TBitmap, TPicture, TMetafile oder TGraphics. Dies sind nicht visuelle Klassen und wenn Du diese dyn. erzeugst brauchen sie deutlich weniger Speicher. Wenn Du sie anzeigen möchtest, dann kannst Du sie ja in ein TImage-Objekt kopieren. Wie so was geht findest Du hier http://www.swissdelphicenter.ch/de/grafik.php und noch jede Menge andere Tips zum Thema Grafik. Außerdem würde ich, wenns denn mal läuft alle großen Grafiken aus externen Dateien laden und nicht im Programm selbst speichern - das ist aber Ansichtskarte.

2.
Konnte VideoForm nicht streamen: TVideoForm Invalid horizontal pixel Index-1
Hier versuchst Du auf was zuzugreifen, was es nicht gibt. Das kann z.B. in einer for-Schleife passieren, wenn Deine Laufvariable zu groß oder zu klein wird.
Code:
Beispiel:
var
  A : array[0..2] of Byte;

procedure Beispiel
var
  i : integer;
begin
  //Folgelzeile wird funktionieren
  for i:=0 to 2 do showmessage(inttostr(A[i]));
  //diese auch
  for i:=1 to 2 do showmessage(inttostr(A[i]));
  //diese nicht
  for i:=0 to 3 do showmessage(inttostr(A[i]));
  //und diese auch nicht
  for i:=-1 to 2 do showmessage(inttostr(A[i]));
end;
Was ich damit sagen will ist überprüfe mal ob alle Laufvariable richtig initialisiert werden, ob Abbruchbedingungen von Schleifen richtig gesetzt sind. Wie lädst Du denn die Bilder in die Imageobjekte? Normalerweise sollte es so
Code:
Image1.Picture.LoadFromFile(...
gehen. Es könnte auch sein, daß Du irgendwo eine Variable zu klein dimensioniert hast. Deinem Quelltext entnehme ich, daß Du ausschließlich Byte benutzt. Denk dran, daß diese nur von 0-255 gehen. Wenn Du dann einer solchen Variable eine größere oder kleinere Zahl während der Laufzeit zu weist kracht es. Mit dem Debugger bekommt man aber sowas raus. Und dann sieht Dein Quelltext so aus, daß Du Laufvariable global deklarierst (z.B. das p in Deiner Procedur). So was ist kreuzgefährlich, weil dann die Variablen unkontrolliert geändert werden könnten. In Deiner Procedur z.B schon gleich hier
Code:
if (StepsButton.Visible) then StepsButtonClick(Sender);
Deklariere solche Variable nur lokal in der Procedur selbst. Wenn Du Variablen gezielt global verändern willst dann übergeb sie mit dem Procedurkopf und wenn Du diese auch wieder weiterverarbeiten möchtest, dann nehme var Parameter für Proceduren oder benutze Funktionen. Ich glaube, daß Du so ein bischen die Übersicht verloren hast, wo welche Variable wie verändert wird. Also: Verwende globale Variable wirklich nur dort wo Du sie wirklich brauchst. Ansonsten benutze lokale Variable. Es spricht nichts dagegen, wenn Du in jeder Procedur eine Variable p declarierst. Das Prog wird dadurch nicht signifikant größer.

3.
./Videoproject:error while loading shared libraries: libgdk_pixbuf.so.2: cannnot open sharec object file: No such file or directory
Ja ist doch klar: Das Programm findet die Library libgdk_pixbuf.so.2 nicht. D.h. im Klartext, Du mußt, wenn Du das Programm weitergibst dafür Sorge tragen, daß obige Lib auf dem System vorhanden ist. Dann könnte sich die Lib natürlich auch in einem Pfad befinden der nicht in $LD_LIBRARY_PATH steht. Du kannst ganz einfach herausfinden gegen welche Libs Dein Programm gelinkt ist. Mache mal ein:
Code:
ldd Videoprojekt
Jetzt mußt Du bei der Installation nur noch abprüfen ob die Libs auf dem Zielsystem vorhanden sind. Notfalls mußt Du Sie nachinstallieren oder die Programminstallation verweigern.
 
Hallo

Sorry das ich mich erst jetzt wieder melde hatte viel zu tun.

Hab aber eigentlich fast alle Probleme beheben können das Program läuft auf dem
Zielsystem nachdem ich das fehlende Packet eingebunden habe. Das die Bilder nicht
dargestellt werden ist auch nicht so problematisch ich werd Sie später in der laufzeit
einbinden.
Das einzige was mir noch Probleme bereitet ist das mit dem CopyRect Befehl könntest
du mir da mal ein kleines Beispiel zweigen?

Will ja immer noch aus TImage Object ein Rechteck rauskopieren was genau so groß ist
wie TImage1 Object, und dieses Rechteck soll dann auch in TImage1 Object eingefügt
werden.Muß irgendwie mit
Image.Picture.Bitmap.Canvas.CopyRect(rect2,image1.Picture.Bitmap.Canvas,rect)
funktionieren aber ich weiß immer noch nicht wie entweder steh ich auf dem Schlauch
oder das ist zu hoch für mich.


MfG

Ingo
 
Um nicht das Rad noch mal zu erfinden hier die genaue Beschreibung des CopyRect- Befehls aus der Delphihilfe
TCanvas.CopyRect

Die Methode CopyRect kopiert einen Teil eines Bildes aus einer anderen Zeichenfläche in die Zeichenfläche.

procedure CopyRect(Dest: TRect; Canvas: TCanvas; Source: TRect);

Beschreibung
Mit CopyRect können Sie einen Teil eines Bildes aus einer anderen Zeichenfläche in das Bild des TCanvas-Objekts kopieren. Die Eigenschaft Dest legt fest, in welches Rechteck innerhalb der Zeichenfläche das Quellbild kopiert werden soll. Der Parameter Canvas gibt die Zeichenfläche an, die das zu kopierende Bild enthält. Source legt das Rechteck fest, das den zu kopierenden Teil der Zeichenfläche enthält.
Der Kopiervorgang erfolgt in dem Modus, der durch CopyMode festgelegt ist.
Und dazu das Beispiel aus der Hilfe:
Code:
Das folgende Beispiel illustriert die Unterschiede zwischen CopyRect und BrushCopy. Die Bitmap-Grafik ‘TARTAN.BMP’ wird in das Objekt Bitmap geladen und auf der Zeichenfläche von Form1 dargestellt. BrushCopy ersetzt die Farbe Schwarz in der Grafik mit dem Wert des Pinsels (Brush) der Zeichenfläche. Im Gegensatz dazu läßt CopyRect die Farben unverändert.

var
  Bitmap: TBitmap;
  MyRect, MyOther: TRect;
begin
  MyRect := Rect(10,10,100,100);
  MyOther := Rect(10,111,100, 201);
  Bitmap := TBitmap.Create;
  Bitmap.LoadFromFile('c:\windows\tartan.bmp');
  Form1.Canvas.BrushCopy(MyRect,Bitmap, MyRect, clBlack);
  Form1.Canvas.CopyRect(MyOther,Bitmap.Canvas,MyRect);
  Bitmap.Free;
end;

Für Dein Beispiel könnte das ganze dann so aussehen:
Code:
procedure TForm1.CopyImage(OffsetX, OffsetY : cardinal);
var
  DestRect   : TRect;     //Position und Größe des Zielrechtecks - entspricht der Größe von Image1
  SourceRect : TRect;     //Position und Größe des zu kopieren Rechtecks (Quelle)
  a, b       : cardinal;  //

begin
  DestRect.Left:=0;
  DestRect.Top:=0;
  DestRect.Right:=Image1.ClientWidth;
  DestRect.Bottom:=Image1.ClientHeight;
  //der Ausschitt der kopiert werden soll ist so groß wie Image1
  //mit dem Offset kann man den Startpunkt verschieben;
  SourceRect.Left:=OffsetX;
  SourceRect.Top:=OffsetY;
  SourceRect.Right:=OffsetX+Image1.ClientWidth;
  SourceRect.Bottom:=OffsetY+Image1.ClientHeight;
  //Hier evtl. noch prüfen, daß SourceRect nicht größer als
  //Image selbst
  Image1.Canvas.CopyRect(DestRect,Image.Canvas,SourceRect);
end;
 
Zurück