tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
14
ZUGRIFFE
2013
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Ingo1 Ingo1 ist offline Mitglied
    Registriert seit
    Aug 2007
    Beiträge
    13
    Hallo

    Ich bin neu hier und hoffe das Ihre mir weiter helfen könnt.
    Ich habe unter Linux(Knoppix) mit Kylix eine kleine Anwendung geschrieben.Da ich mich
    mit dem Progamm aber nicht auskenne sind ein paar Fragen aufgetaucht, die Ihr mir hoffentlich beantworten könnt. Ich habe Sie der Priorität nach geordnet.

    1. Wie starte ich eine Kylix Anwendung auf einem Rechner wo kein Kylix installiert ist?
    2. Wie ordne ich Buttons die ich in Kylix gesetzt habe und mit der Maus betätigen kann,
    einen Buchstaben zur Betätigung zu (nicht in Caption mit &XY will kein ALT drücken
    müssen)
    3. Wie kann ich Teile einer Bitmap die ich mit Strech in einem Image Anzeigen lasse in
    ein anderes Image rein kopieren? So das ich z.B. nur die 1/2 oder 1/4 des Bildes im
    neuen Image angezeigt bekomme? Hab in der Kylix Hilfe irgendwas mit CopyRect
    gefunden aber wie genau weiß ich nicht.

    Auch wenn Ihr mir nur eine Frage beantworten könnt wäre ich euch schon sehr Dankbar
    hab nämlich schon über all geguckt und komm nicht weiter.

    MfG
    Ingo1
     

  2. #2
    Twinsetter Twinsetter ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    95
    zu 1. Kylix erzeugt normalerweise ausführbare Dateien. Evtl. mußt Du jedoch noch Laufzeitpackages mitgeben. Lies Dir mal die Datei DEPLOY.TXT von Kylix durch.

    zu 2. Dazu mußt Du KeyPreview des Formulares auf TRUE setzen und im OnKeyPress oder OnKeyDown -Ereignis des Formulares den gedrückten Buchstaben ermitteln
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
    begin
       case Key of
          a,A : Button1Click(Sender); 
          b,B : Button2Click(Sender); 
          c,C : Button3Click(Sender); 
          d,D : Button4Click(Sender);   
        end;
    end;
    Damit obiger Code funktioniert muß für jeden Button natürlich ein OnClick Ereignis definiert sein.

    zu 3. Schau mal hier nach http://www.swissdelphicenter.ch/de/grafik.php. Ist zwar für Delphi aber Kylix ist ja quasi Delphi.

    Kleiner Tip: Ich würde lieber mit Lazerus an Stelle von Kylix arbeiten, da die Entwicklung von Kylix eingestellt ist. Lazerus ist eine frei verfügbare IDE für Objektpascal. Lazerus ist stark an Delphi angelehnt und für Linux als auch für Windows verfügbar. Für Lazerus gibt es mehr Komponenten als für Kylix.
     

  3. #3
    Ingo1 Ingo1 ist offline Mitglied
    Registriert seit
    Aug 2007
    Beiträge
    13
    Hallo Twinsetter

    Danke für die Hilfe bei meinen Problemen.

    zu 1. Kylix erzeugt normalerweise ausführbare Dateien. Evtl. mußt Du jedoch noch Laufzeitpackages mitgeben. Lies Dir mal die Datei DEPLOY.TXT von Kylix durch.
    Da hast du recht Kylix erzeugt eine ausführbare Datei aber selbst auf dem Rechner wo Kylix installiert ist muß ich in die profile Datei noch folgenden link eintragen "export LD_LIBRARY_PATH= /user/local/kylix3/bin:$LD_LIBRARY_PATH". Hab mir dann gedacht na gut dann kopier ich halt den gesamten bin Ordner noch mit auf das System wo die Anwendung laufen soll, aber kein Kylix installiert ist. Doch das hat nichts gebracht konnte die ausführbare Datei immer noch nicht aufrufen. Und aus der DEPLOY.txt Datei bin ich nicht wirklich schlau geworden da steht auch was von Bibliotheken die man mit liefern muß aber welche brauch ich und wie link ich die?

    zu 2. Dazu mußt Du KeyPreview...
    Procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
    begin
    case Key of
    a,A : Button1Click(Sender);

    end;
    end;
    ... Ereignis definiert sein.
    Super danke das hat geklappt jetzt nur noch ne Kleinigkeit wie kann ich den Pfeiltasten (hoch runter rechts links) was zu ordnen? Im moment werden Sie ja automatisch (von Kylix vorgegeben) zum verschieben des Focus verwendet. Muß ich diese Funktion erst ausschalten oder wie kann ich denen sonst nen Button1Click(Sender) zuordnen?

    zu3. muß ich ncoh mal gucken bis jetzt hab ich da noch nichts nützliches gefunden.


    MfG
    Ingo1
     

  4. #4
    Twinsetter Twinsetter ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    95
    Also mit den Libaries muß ich selbst noch mal nachschauen, was man da alles mitgeben muß und wie's genau geht. Muß da noch mal in einem Buch nachlesen, da komme ich aber erst am Wochenende wieder dazu.

    Mit den Pfeiltasten ist auch ganz einfach. Hierfür kann man das Ereignis onKeyDown benutzen da dieses auf alle Tasten, also auch auf Sondertasten regiert.
    Erzeuge einfach mal ein neues Projekt. Setze bei dem Formular die Eigenschaft KeyPreview auf True. Auf das Formular plazierst Du ein Label und dann schreibst Du in die onKeyDown Procedure folgenden Code:
    Code :
    1
    2
    3
    4
    
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
      Label1.Caption:=inttostr(Key);
    end;
    Jetzt kannst Du die Tasten drücken die Du in Deinem Programm benutzen möchtest. Das Label zeigt dabei den Code der gedrückten Taste an. Wenn Du z.B. a drückst wird 65 angezeigt, Cursor nach oben entspricht 38, Return 13 usw.
    Die zahlen kannst Du dann wieder mit case auswerten, also:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    case Key of
       38 : begin
              
              end;
        65 : begin
     
               end;
    end;

    Denk mal über Lazarus nach. Da muß Du nichts mitgeben und das wird auch weiter entwickelt.
     

  5. #5
    Ingo1 Ingo1 ist offline Mitglied
    Registriert seit
    Aug 2007
    Beiträge
    13
    Hallo

    Danke für den Tip habs geschafft alle Tasten die ich brauche zu verwenden Problem war
    das bei den Button Objekten die Eigenschaft TABSTOP auf false gesetzt werden muß
    und ich keinen Button mit der Maus anklicken darf da sonst wieder ein Focus gesetzt
    wird und die Pfeiltasten dadurch belegt sind. Macht aber nichts in meiner Orginal
    Anwendung hab ich keine Maus.

    Zu Lazarus ich werd es mir heute mal angucken da es ja ähnlich aufgebaut ist wie Kylix und
    auch mit Delphi geschrieben wird. Weil eigentlich will ich in drei Wochen mit dem Projekt
    fertig sein und Kylix ist schon die zweite Entwicklungsumgebung die ich verwende vorher
    hab ich mit QT. Werd mich dann heut mittag noch mal melden wie es war.

    MfG
    Ingo
     

  6. #6
    Ingo1 Ingo1 ist offline Mitglied
    Registriert seit
    Aug 2007
    Beiträge
    13
    Hallo

    Scheint ganz gut zu sein soweit ich es unter Windows gesehen habe.

    Aber wie bekomme ich es jetzt unter Linux(Knoppix) installiert war auf dieser Seite
    http://sourceforge.net/project/showf...oup%20id=89339
    und hab mir alle Lazarus Linux i386 DEB Lazarus 0.9.22 heruntergeladen und versucht
    sie über den Packagemanager zu installieren hat bis auf die lazarus_0.9.22-1_i386.deb
    Datei auch geklappt aber bei der bekomm ich immer ne Fehlermeldung.
    Ein Lazarus Icon ist auch schon im Entwicklungs Ordner aber ich kann es halt nicht
    aufrufen. Was mach ich falsch oder wie installier ich es einfacher.

    PS: komm nur über Windows ins Netz unter Linux geht´s leider nicht.

    MfG
    Ingo1
     

  7. #7
    Ingo1 Ingo1 ist offline Mitglied
    Registriert seit
    Aug 2007
    Beiträge
    13
    Also irgendwie hab ich es doch zum laufen bekommen aber wenn ich ein Program starten will schreibt Lazarus immer FATALER FEHLER Can´t find glib Unit
    wo bekomm ich die her oder wie kann ich den Fehler beseitigen?


    MfG
    Ingo1
     

  8. #8
    Twinsetter Twinsetter ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    95
    Also mit Lazarus unter Linux muß ich mal bei mir schauen. Bei mir läuft es unter RedHat und auch Debian.

    Knoppix ist im Prinzip Debian, so daß dort normalerweise mit apt-get install <Paketname> installiert wird. Das funktioniert natürlich am besten im Netz, da dann auch gleich alle Abhängigkeiten aufgelöst werden. Aber wie gesagt da müßte ich noch mal nachschauen.

    TabStop mußt Du nur auf False setzen, wenn Du die Tabulartotaste zum navigieren nutzen möchtest, das kann aber auch auf True stehen habe ich zumindest ausprobiert.

    Um zu umgehen, das der Button beim Drücken einer Pfeiltaste oder der Entertaste aktiviert wird, mußt Du nur verhindern, das der Button den Focus erhält. Dazu schmeißt Du ein Editfeld auf das Formular und srtz Height und Width jeweils auf 0 - dadurch ist es unsichtbar. Das Feld nicht mit visible auf unsichbar schalten sonst krachts!
    Dann kommt noch ein Timer auf das Formular. Den Timertick setzt Du auf ca. 50ms Die onTimer-Procedur sollte wie folgt aussehen:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      if Button1.Focused then begin
         try 
           Edit1.SetFocus;
         except
         end;
      end
    end;

    Hierdurch erhält das nicht sichbare Editfeld den Focus, wenn der Button1 den Focus hat und Button1 verliert demzufolge den Focus. So kannst Du auch mit anderen Objekten verfahren indem Du deren Focus auf das nicht sichbare Editfeld umlenkst.
    Zwar nicht super elegant - aber funktioniert. Du kannst dann Maus oder Taste benutzen und außerdem entfällt auch der Focusrahmen des Buttons.
     

  9. #9
    Ingo1 Ingo1 ist offline Mitglied
    Registriert seit
    Aug 2007
    Beiträge
    13
    Hallo

    Habs geschafft in der Datei /etc/fpc.cfg waren falsche links angegeben danach konnte
    ich mein Programm starten ist zwar noch nicht ganz so weit wie unter Kylix aber mal
    sehen.

    Jetzt hab ich aber ein neues Problem wenn ich in die Image Objekte ein Bild laden möcht und das Program dann ausführen will,
    bekomme ich folgende Fehlermeldung:
    Konnte VideoForm nicht streamen: TVideoForm Invalid horizontal pixel Index-1

    Was hat das zu bedeuten? Und wie kann ich meine Bilder darstellen?

    Trotzdem hab ich aber versucht das Programm auf einem anderen Rechner laufen zu lassen, doch das funktionierte leider nicht.
    Ich hab den kompletten Projectordner auf meinen USB-Stick kopiert, von dem ich auf dem Zielrechner Knoppix Booten lasse. Und erst sah auch alles gut aus eine 7MB große Ausführbare Datei war dabei.Doch als ich dann Knoppix auf dem Zielrechner gebootet habe und in den Projectordner gegangen bin ist diese Datei auf einmal eine 7MB große Einfacher Text Datei.
    Muß ich noch irgend was vorher machen damit ich das Progam ausführen kann?
    Wenn ja was?

    MfG
    Ingo
    Geändert von Ingo1 (30.08.07 um 15:41 Uhr)
     

  10. #10
    Twinsetter Twinsetter ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    95
    Also, daß aus dieser Binärdatei plötzlich eine Textdatei wird mag ich nicht so richtig glauben. Aber sei's drum. Läuft denn diese Datei auf dem System wo Du sie kompiliert hast und zwar ohne IDE (also Lazarus bzw. Kylix). Ist die Datei wirklich ausführbar - mit
    ls -l Datei
    überprüfen. Versuch mal die Datei von einem Terminalfenster aus zu starten, dann siehst Du eventuelle Fehlermeldungen. Denk dran wenn Du im Verzeichnis bist mußt Du die Datei mit ./Datei starten.

    Wieso ist Deine Datei überhaupt so groß. 7MB ist ein Haufen Holz. Ich arbeite derzeit an einem sehr großen Projekt (allerdings unter Windows mit Delphi) da ist die kompilierte EXE ca. 4,5MB (gepackt sogar nur 1,2MB) groß. Dabei ist zu bedenken, daß das Hauptprogramm aus über 100 selbst erstellten Units erzeugt wird, wobei die Hauptunit ca. 6500 Programmzeilen umfaßt und noch einige Units mit über 2000 Zeilen dabei sind. Hinzu kommt noch der Code der durch die benutzten Komponenten eingebunden wird.
    Hast Du ganze Filme oder riesige Bitmaps eingebunden

    Was für Image Objekte hast Du denn Poste mal ein bischen Quelltext Damit man besser nachvollziehen kann, was Du da machst.
     

  11. #11
    Ingo1 Ingo1 ist offline Mitglied
    Registriert seit
    Aug 2007
    Beiträge
    13
    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-Code:
    unit VideoUnit;

    {
    $mode objfpc}{$H+}

    interface

    uses
      Classes
    SysUtilsLResourcesFormsControlsGraphicsDialogsButtons,
      
    StdCtrlsExtCtrls;

    type

      
    TVideoForm }

      
    TVideoForm = class(TForm)
        
    LeftButtonTSpeedButton;
        
    SplitImage1TImage;
        
    SplitImageTImage;
        
    MasterImageTImage;
        
    StatusLabelTLabel;
        
    ZoomButton1TSpeedButton;
        
    ZoomButton2TSpeedButton;
        
    IrisButton1TSpeedButton;
        
    IrisButton2TSpeedButton;
        
    FocusButton1TSpeedButton;
        
    FocusButton2TSpeedButton;
        
    UpButtonTSpeedButton;
        
    DownButtonTSpeedButton;
        
    RightButtonTSpeedButton;
        
    TotalzoomButtonTSpeedButton;
        
    WeitwinkelButtonTSpeedButton;
        
    ScanYButtonTSpeedButton;
        
    ScanXButtonTSpeedButton;
        
    HoldButtonTSpeedButton;
        
    SplitscreenButtonTSpeedButton;
        
    WartungsButtonTSpeedButton;
        
    ZahnradButtonTSpeedButton;
        
    StepsButtonTSpeedButton;


        
    procedure ZoomButton1Click(SenderTObject);
        
    procedure SplitscreenButtonClick(SenderTObject);
        
    procedure WartungsButtonClick(SenderTObject);
        
    procedure StepsButtonClick(SenderTObject);
        
    procedure ZoomButton2Click(SenderTObject);
        
    procedure IrisButton1Click(SenderTObject);
        
    procedure IrisButton2Click(SenderTObject);
        
    procedure FocusButton1Click(SenderTObject);
        
    procedure FocusButton2Click(SenderTObject);
        
    procedure WeitwinkelButtonClick(SenderTObject);
        
    procedure TotalzoomButtonClick(SenderTObject);
        
    procedure UpButtonClick(SenderTObject);
        
    procedure DownButtonClick(SenderTObject);
        
    procedure LeftButtonClick(SenderTObject);
        
    procedure RightButtonClick(SenderTObject);
        
    procedure ZahnradButtonClick(SenderTObject);
        
    procedure FormCreate(SenderTObject);
        
    procedure HoldButtonClick(SenderTObject);
        
    procedure ScanXButtonClick(SenderTObject);
        
    procedure ScanYButtonClick(SenderTObject);
        
    procedure FormKeyDown(SenderTObject; var KeyWord;
          
    ShiftTShiftState);
          
       private
        { private 
    declarations }
      public
        { public 
    declarations }
      
    end

    var
      
    VideoFormTVideoForm;

    implementation

    TVideoForm }

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

    procedure TVideoForm.SplitscreenButtonClick(SenderTObject);
    begin
         p
    :=p+1;
         if (
    StepsButton.Visiblethen StepsButtonClick(Sender);
         if (
    ZahnradButton.Visiblethen 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
     

  12. #12
    Twinsetter Twinsetter ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    95
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    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 :
    1
    
    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 :
    1
    
    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 :
    1
    
    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.
     

  13. #13
    Ingo1 Ingo1 ist offline Mitglied
    Registriert seit
    Aug 2007
    Beiträge
    13
    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
     

  14. #14
    Twinsetter Twinsetter ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    95
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    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;
     

  15. #15
    Ingo1 Ingo1 ist offline Mitglied
    Registriert seit
    Aug 2007
    Beiträge
    13
    Danke es funktioniert
     

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 24.01.11, 09:18
  2. Hilfe! Java Anwendung läuft nicht.
    Von BFreakout im Forum Java
    Antworten: 0
    Letzter Beitrag: 26.10.06, 12:27
  3. Benötige Hilfe in einer Server Client Anwendung
    Von Silvercreast im Forum .NET Web und Kommunikation
    Antworten: 1
    Letzter Beitrag: 24.10.05, 09:51
  4. Hilfe PocketPC-Anwendung
    Von theartmix im Forum .NET Archiv
    Antworten: 4
    Letzter Beitrag: 07.04.05, 13:35
  5. Kleine Hilfe zu einer SDI anwendung
    Von LoKi1 im Forum VisualStudio & MFC
    Antworten: 6
    Letzter Beitrag: 13.01.05, 11:56